home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / IEditor / main.c < prev    next >
C/C++ Source or Header  |  1997-06-17  |  58KB  |  2,571 lines

  1. /// Include
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. #define INTUI_V36_NAMES_ONLY
  9. #define ASL_V38_NAMES_ONLY
  10. #define CATCOMP_NUMBERS
  11.  
  12. #include <exec/nodes.h>                 // exec
  13. #include <exec/lists.h>
  14. #include <exec/memory.h>
  15. #include <exec/ports.h>
  16. #include <exec/libraries.h>
  17. #include <intuition/intuition.h>        // intuition
  18. #include <intuition/screens.h>
  19. #include <intuition/sghooks.h>
  20. #include <intuition/gadgetclass.h>
  21. #include <dos/dos.h>                    // dos
  22. #include <dos/rdargs.h>
  23. #include <workbench/startup.h>          // workbench
  24. #include <rexx/rexxio.h>                // rexx
  25. #include <rexx/errors.h>
  26. #include <rexx/storage.h>
  27. #include <libraries/gadtools.h>         // libraries
  28. #include <libraries/asl.h>
  29. #include <libraries/reqtools.h>
  30. #include <libraries/locale.h>
  31. #include <clib/exec_protos.h>           // protos
  32. #include <clib/intuition_protos.h>
  33. #include <clib/graphics_protos.h>
  34. #include <clib/dos_protos.h>
  35. #include <clib/diskfont_protos.h>
  36. #include <clib/rexxsyslib_protos.h>
  37. #include <clib/locale_protos.h>
  38. #include <clib/asl_protos.h>
  39. #include <clib/reqtools_protos.h>
  40. #include <clib/gadtools_protos.h>
  41. #include <pragmas/exec_pragmas.h>       // pragmas
  42. #include <pragmas/intuition_pragmas.h>
  43. #include <pragmas/graphics_pragmas.h>
  44. #include <pragmas/dos_pragmas.h>
  45. #include <pragmas/locale_pragmas.h>
  46. #include <pragmas/asl_pragmas.h>
  47. #include <pragmas/reqtools_pragmas.h>
  48. #include <pragmas/gadtools_pragmas.h>
  49. #include <pragmas/rexxsyslib_pragmas.h>
  50. #include <pragmas/diskfont_pragmas.h>
  51.  
  52.  
  53. #include "DEV_IE:defs.h"
  54. #include "DEV_IE:GUI.h"
  55. #include "DEV_IE:GUI_locale.h"
  56. #include "DEV_IE:Include/generatorlib-protos.h"
  57. #include "DEV_IE:Include/generatorlib.h"
  58. #include "DEV_IE:Include/generator_pragmas.h"
  59. #include "DEV_IE:Include/expanders.h"
  60. #include "DEV_IE:Include/expander_pragmas.h"
  61. ///
  62. /// Prototipi
  63. static BOOL     OpenLibs( void );
  64. static void     CloseLibs( void );
  65. static void     CleanUp( ULONG );
  66. static void     ParseArguments( void );
  67. static void     SetupNames( void );
  68. void            wbmain( void * );
  69. void            main( void );
  70. static BOOL     OpenScr( void );
  71. static void     CloseScr( void );
  72. static void     CaricaPrefs( void );
  73. static BOOL     processmenu( int );
  74. static void     ProcessKey( int, int );
  75. static void     ProcessRawKey( int, int );
  76. static BOOL     CheckMacroKeys( int, int );
  77. static BOOL     ListaSelect( void );
  78. static void     ToolsCloseWindow( void );
  79. static BOOL     GetLoaders( void );
  80. static void     FreeLoaders( void );
  81. static void     NewHandleRexxMsg( void );
  82. static void     HandleSrcParams( void );
  83.  
  84. extern struct WBStartup *_WBMsg;
  85.  
  86. #define MAX_PATH        1024
  87. #define PREFS_MENU         6
  88. ///
  89.  
  90. /// Basi delle librerie
  91. struct Library          *GfxBase;
  92. struct IntuitionBase    *IntuitionBase;
  93. struct Library          *GadToolsBase;
  94. struct Library          *AslBase;
  95. struct Library          *ReqToolsBase;
  96. struct Library          *DiskfontBase;
  97. struct Library          *IFFParseBase;
  98. struct Library          *IconBase;
  99. struct Library          *RexxSysBase;
  100. struct Library          *LocaleBase;
  101. struct Generator        *GenBase;
  102. struct Expander         *IEXBase;
  103. ///
  104. /// Buffers
  105. UBYTE                   allpath[ MAX_PATH ];
  106. UBYTE                   allpath2[ MAX_PATH ];
  107. UBYTE                   save_file[ MAX_PATH ];
  108. UBYTE                   initial_drawer[ 300 ];
  109. UBYTE                   initial_file[ 300 ];
  110.  
  111. UBYTE                   DefaultTool[256];
  112.  
  113. TEXT                    MyPubName[12];
  114. TEXT                    MyRexxPort[12];
  115. TEXT                    SharedPort[60];
  116.  
  117. BPTR                    File, KeyFileSeg;
  118.  
  119. long                    buffer, buffer2, buffer3;
  120.  
  121. int                     RetCode;
  122.  
  123. ULONG                  *list_from_eor, *list_to_eor;
  124.  
  125. UWORD                   toolsx, toolsy = 12, clickx, clicky;
  126. WORD                    offx, offy, mousex, mousey, oldx, oldy;
  127.  
  128. UBYTE                   Macros[30][256];
  129.  
  130. UBYTE                   coord_txt[18];
  131.  
  132. UWORD                   ticks;
  133.  
  134. struct Process          *MyTask;
  135. struct MsgPort          *IDCMP_Port;
  136. ///
  137. /// Dati
  138. struct TextAttr Topaz8Font = { "topaz.font", 8, 0, 1 };
  139.  
  140. struct IntuiText CoordIText = { 1, 2, JAM2, -155, 0, &Topaz8Font, coord_txt, 0 };
  141.  
  142. APTR                    old_WindowPtr;
  143. static BPTR             old_Dir;
  144.  
  145. ULONG                   rexx_mask, signalset, editing_mask, back_mask;
  146. BOOL                    Ok_to_Run = TRUE;
  147.  
  148. UWORD                   Generator;
  149.  
  150. static struct IEXFun    IEX_Functions = {
  151.     SplitLines,
  152.     GetFirstLine,
  153.     WriteFormatted,
  154.     AddGadgetKind,
  155.     AddARexxCmd
  156. };
  157.  
  158. static struct MiscFun   IE_Functions = {
  159.     AggiungiFont,
  160.     Stat,
  161.     EliminaFont,
  162.     AllocObject,
  163.     FreeObject,
  164.     GetGad,
  165.     FindString,
  166.     FindArray,
  167. };
  168.  
  169. static struct UserData  UserData = { "Freeware Version", 0 };
  170.  
  171. struct IE_Data  IE = {
  172.         SALVATO,                    // flags
  173.         REXX,                       // flags_2
  174.         0,                          // mainprefs
  175.         0,                          // SrcFlags
  176.         0,                          // MainProcFlags
  177.         0, 0,                       // AsmPrefs, AsmPrefs2
  178.         0,                          // C_Prefs
  179.         NULL,                       // gad_id
  180.         NULL,                       // win_active
  181.         NULL,                       // win_info
  182.         NULL,                       // colortable
  183.         0, 0,                       // win_open, num_win
  184.         { &IE.win_list.mlh_Tail, NULL, &IE.win_list },
  185.         { &IE.FntLst.mlh_Tail, NULL, &IE.FntLst },
  186.         0,
  187.         { &IE.Img_List.mlh_Tail, NULL, &IE.Img_List },
  188.         MyPubName,
  189.         MyRexxPort,
  190.         0,
  191.         { &IE.Libs_List.mlh_Tail, NULL, &IE.Libs_List },
  192.         0,
  193.         { &IE.WndTO_List.mlh_Tail, NULL, &IE.WndTO_List },
  194.         0,
  195.         { &IE.Rexx_List.mlh_Tail, NULL, &IE.Rexx_List },
  196.         &ScrData,
  197.         &IE_Functions,
  198.         RexxExt,
  199.         ARexxPortName,
  200.         ExtraProc,
  201.         NULL,
  202.         CP_ChipString2,
  203.         AP_IntString2,
  204.         AP_DosString2,
  205.         AP_GfxString2,
  206.         AP_GadString2,
  207.         AP_FntString2,
  208.         AP_RexxString2,
  209.         &LocInfo,
  210.         &IEX_Functions,
  211.         &UserData,
  212.         { &IE.Expanders.mlh_Tail, NULL, &IE.Expanders.mlh_Head },
  213.         &IEXSrcFunctions,
  214.         SharedPort
  215.     };
  216.  
  217. struct MinList Loaders = { &Loaders.mlh_Tail, NULL, &Loaders.mlh_Head };
  218. struct MinList Generators = { &Generators.mlh_Tail, NULL, &Generators.mlh_Head };
  219. ///
  220. /// Stringhe
  221. static UBYTE    TEMPLATE[]    = "FILE";
  222. static UBYTE    PubName_fmt[] = "IEDITOR.%d";
  223.  
  224. UBYTE           KeyFile[]   = "PROGDIR:IEditor.key";
  225. UBYTE           PrefsFile[] = "S:IEditor.prefs";
  226.  
  227. UBYTE           ok_txt[] = "_Ok";
  228.  
  229. UBYTE   CoordFmt_txt[]  = "X: %4d  Y: %4d";
  230.  
  231. ULONG   DataHeader[]    = { 'IEDf', 3 };
  232. ULONG   ScrHeader       = 'SCRN';
  233. ULONG   InterfHeader    = 'INTF';
  234. ULONG   FinestraHeader  = 'WNDW';
  235. ULONG   GadgetHeader    = 'GADG';
  236. ULONG   MenuHeader      = 'MENU';
  237.  
  238. UBYTE   smartrefresh_txt[] = "  Smart Refresh";
  239. ///
  240. /// Dati requester
  241. ULONG ReqTags[] = {
  242.     RTEZ_ReqTitle, 0, RT_ReqPos, REQPOS_CENTERSCR,
  243.     RT_Underscore, (ULONG)'_', TAG_DONE
  244. };
  245. ///
  246. /// idcmps & flags
  247. ULONG idcmps[] = {
  248.         1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
  249.         0x400, 0x800, 0x1000, 0x2000, 0x4000, 0x8000,
  250.         0x10000, 0x20000, 0x40000, 0x80000, 0x100000,
  251.         0x200000, 0x400000, 0x800000, 0x1000000,
  252.         0x2000000, 0x4000000
  253.       };
  254.  
  255. ULONG wflgs[] = {
  256.         1, 2, 4, 8, 0x10, 0x20, 0, 0x40, 0x80, 0x100, 0x200,
  257.         0x400, 0x800, 0x1000, 0x10000, 0x20000, 0x40000,
  258.         0x200000
  259.       };
  260. ///
  261. /// Dati per i menu (e gadget) da attivare
  262. ULONG attivamenu_nuovawin[] = {
  263.     (4<<5), (5<<5), (-1<<11)|(8<<5), (2<<5)|1,
  264.     (3<<5)|1, (4<<5)|1, (14<<5)|1, (22<<5)|1, (13<<5)|1,
  265.     (6<<5)|1, (7<<5)|1, (9<<5)|1, (10<<5)|1, (11<<5)|1,
  266.     (12<<5)|1, 4, (21<<5)|1, (-1<<11)|(-1<<5)|2,
  267.     (-1<<11)|(16<<5)|1, (-1<<11)|(17<<5)|1,
  268.     (-1<<11)|(18<<5)|1, (-1<<11)|(19<<5)|1
  269.       };
  270.  
  271. ULONG disattiva_noopen[] = {
  272.     (3<<5)|1, (4<<5)|1, (14<<5)|1, (22<<5)|1, (13<<5)|1,
  273.     (6<<5)|1, (7<<5)|1, (9<<5)|1, (10<<5)|1, (11<<5)|1,
  274.     (12<<5)|1, 4, (21<<5)|1, (-1<<11)|(-1<<5)|2,
  275.     (-1<<11)|(16<<5)|1, (-1<<11)|(17<<5)|1,
  276.     (-1<<11)|(18<<5)|1, (-1<<11)|(19<<5)|1
  277.       };
  278.  
  279. static struct Gadget *Tools_gads[] = {
  280.     &DelWndGadget,
  281.     &AddGadGadget,
  282.     &IDCMPGadget,
  283.     &WFlagsGadget,
  284.     &OpenImgBankGadget
  285.       };
  286. ///
  287. /// Liste
  288. extern struct MinList listgadgets;
  289.  
  290. struct Node KindNodes[]= {
  291.     &KindNodes[1], (struct Node *)&listgadgets.mlh_Head, 0, 0, "BUTTON KIND",
  292.     &KindNodes[2], &KindNodes[0], 0, 0, "CHECKBOX KIND",
  293.     &KindNodes[3], &KindNodes[1], 0, 0, "INTEGER KIND",
  294.     &KindNodes[4], &KindNodes[2], 0, 0, "LISTVIEW KIND",
  295.     &KindNodes[5], &KindNodes[3], 0, 0, "MX KIND",
  296.     &KindNodes[6], &KindNodes[4], 0, 0, "NUMBER KIND",
  297.     &KindNodes[7], &KindNodes[5], 0, 0, "CYCLE KIND",
  298.     &KindNodes[8], &KindNodes[6], 0, 0, "PALETTE KIND",
  299.     &KindNodes[9], &KindNodes[7], 0, 0, "SCROLLER KIND",
  300.     &KindNodes[10], &KindNodes[8], 0, 0, "SLIDER KIND",
  301.     &KindNodes[11], &KindNodes[9], 0, 0, "STRING KIND",
  302.     &KindNodes[12], &KindNodes[10], 0, 0, "TEXT KIND",
  303.     (struct Node *)&listgadgets.mlh_Tail, &KindNodes[11], 0, 0, "BOOLEAN" };
  304.  
  305. struct MinList listgadgets = {
  306.     (struct MinNode *)&KindNodes[0], (struct MinNode *)NULL, (struct MinNode *)&KindNodes[12] };
  307.  
  308. extern struct MinList listidcmp;
  309.  
  310. struct Node IDCMPNodes[]= {
  311.     &IDCMPNodes[1], (struct Node *)&listidcmp.mlh_Head, 0, 0, "  SIZE VERIFY",
  312.     &IDCMPNodes[2], &IDCMPNodes[0], 0, 0, "  NEW SIZE",
  313.     &IDCMPNodes[3], &IDCMPNodes[1], 0, 0, "  REFRESH WINDOW",
  314.     &IDCMPNodes[4], &IDCMPNodes[2], 0, 0, "  MOUSE BUTTONS",
  315.     &IDCMPNodes[5], &IDCMPNodes[3], 0, 0, "  MOUSE MOVE",
  316.     &IDCMPNodes[6], &IDCMPNodes[4], 0, 0, "  GADGET DOWN",
  317.     &IDCMPNodes[7], &IDCMPNodes[5], 0, 0, "  GADGET UP",
  318.     &IDCMPNodes[8], &IDCMPNodes[6], 0, 0, "  REQ SET",
  319.     &IDCMPNodes[9], &IDCMPNodes[7], 0, 0, "  MENU PICK",
  320.     &IDCMPNodes[10], &IDCMPNodes[8], 0, 0, "  CLOSE WINDOW",
  321.     &IDCMPNodes[11], &IDCMPNodes[9], 0, 0, "  RAW KEY",
  322.     &IDCMPNodes[12], &IDCMPNodes[10], 0, 0, "  REQ VERIFY",
  323.     &IDCMPNodes[13], &IDCMPNodes[11], 0, 0, "  REQ CLEAR",
  324.     &IDCMPNodes[14], &IDCMPNodes[12], 0, 0, "  MENU VERIFY",
  325.     &IDCMPNodes[15], &IDCMPNodes[13], 0, 0, "  NEW PREFS",
  326.     &IDCMPNodes[16], &IDCMPNodes[14], 0, 0, "  DISK INSERTED",
  327.     &IDCMPNodes[17], &IDCMPNodes[15], 0, 0, "  DISK REMOVED",
  328.     &IDCMPNodes[18], &IDCMPNodes[16], 0, 0, "  WBENCH MESSAGE",
  329.     &IDCMPNodes[19], &IDCMPNodes[17], 0, 0, "  ACTIVE WINDOW",
  330.     &IDCMPNodes[20], &IDCMPNodes[18], 0, 0, "  INACTIVE WINDOW",
  331.     &IDCMPNodes[21], &IDCMPNodes[19], 0, 0, "  DELTA MOVE",
  332.     &IDCMPNodes[22], &IDCMPNodes[20], 0, 0, "  VANILLA KEY",
  333.     &IDCMPNodes[23], &IDCMPNodes[21], 0, 0, "  INTUI TICKS",
  334.     &IDCMPNodes[24], &IDCMPNodes[22], 0, 0, "  IDCMP UPDATE",
  335.     &IDCMPNodes[25], &IDCMPNodes[23], 0, 0, "  MENU HELP",
  336.     &IDCMPNodes[26], &IDCMPNodes[24], 0, 0, "  CHANGE WINDOW",
  337.     (struct Node *)&listidcmp.mlh_Tail, &IDCMPNodes[25], 0, 0, "  GADGET HELP" };
  338.  
  339. struct MinList listidcmp = {
  340.     (struct MinNode *)&IDCMPNodes[0], (struct MinNode *)NULL, (struct MinNode *)&IDCMPNodes[26] };
  341.  
  342. extern struct MinList listflags;
  343.  
  344. struct Node FlagsNodes[]= {
  345.     &FlagsNodes[1], (struct Node *)&listflags.mlh_Head, 0, 0, "  Size Gadget",
  346.     &FlagsNodes[2], &FlagsNodes[0], 0, 0, "  Drag Bar",
  347.     &FlagsNodes[3], &FlagsNodes[1], 0, 0, "  Depth Gadget",
  348.     &FlagsNodes[4], &FlagsNodes[2], 0, 0, "  Close Gadget",
  349.     &FlagsNodes[5], &FlagsNodes[3], 0, 0, "  Size BRight",
  350.     &FlagsNodes[6], &FlagsNodes[4], 0, 0, "  Size BBottom",
  351.     &FlagsNodes[7], &FlagsNodes[5], 0, 0, smartrefresh_txt,
  352.     &FlagsNodes[8], &FlagsNodes[6], 0, 0, "  Simple Refresh",
  353.     &FlagsNodes[9], &FlagsNodes[7], 0, 0, "  Super Bitmap",
  354.     &FlagsNodes[10], &FlagsNodes[8], 0, 0, "  Backdrop",
  355.     &FlagsNodes[11], &FlagsNodes[9], 0, 0, "  Report Mouse",
  356.     &FlagsNodes[12], &FlagsNodes[10], 0, 0, "  Gimme Zero Zero",
  357.     &FlagsNodes[13], &FlagsNodes[11], 0, 0, "  Borderless",
  358.     &FlagsNodes[14], &FlagsNodes[12], 0, 0, "  Activate",
  359.     &FlagsNodes[15], &FlagsNodes[13], 0, 0, "  RMB Trap",
  360.     &FlagsNodes[16], &FlagsNodes[14], 0, 0, "  No Care Refresh",
  361.     &FlagsNodes[17], &FlagsNodes[15], 0, 0, "  Nw Extended",
  362.     (struct Node *)&listflags.mlh_Tail, &FlagsNodes[16], 0, 0, "  New Look Menus" };
  363.  
  364. struct MinList listflags = {
  365.     (struct MinNode *)&FlagsNodes[0], (struct MinNode *)NULL, (struct MinNode *)&FlagsNodes[17] };
  366. ///
  367. /// Tags
  368. ULONG   CheckedTag[]  = { GTCB_Checked, 0, TAG_END };
  369. ULONG   PaletteTag[]  = { GTPA_Color, 0, TAG_END };
  370. ULONG   PaletteTag2[] = { GTPA_Color, 0, TAG_END };
  371. ULONG   CycleTag[]    = { GTCY_Active, 0, TAG_END };
  372. ULONG   CycleTag2[]   = { GTCY_Active, 0, TAG_END };
  373. ULONG   CycleTag3[]   = { GTCY_Active, 0, TAG_END };
  374. ULONG   StringTag[]   = { GTST_String, 0, TAG_END };
  375. ULONG   TextTag[]     = { GTTX_Text, 0, TAG_END };
  376. ULONG   IntegerTag[]  = { GTIN_Number, 0, TAG_END };
  377. ULONG   MXTag[]       = { GTMX_Active, 0, TAG_END };
  378. ULONG   DisableTag[]  = { GA_Disabled, 0, TAG_END };
  379. ULONG   ListTag[]     = { GTLV_Labels, 0, TAG_END };
  380. ULONG   List2Tag[]    = { GTLV_Top, 0, GTLV_Selected, 0, TAG_END };
  381. ULONG   List2Tag2[]   = { GTLV_Top, 0, GTLV_Selected, 0, TAG_END };
  382. ULONG   List2Tag3[]   = { GTLV_Top, 0, GTLV_Selected, 0, TAG_END };
  383. static ULONG   ListWndTag[]  = { GTLV_Top, 0, GTLV_Selected, 0, TAG_END };
  384. ///
  385.  
  386.  
  387.  
  388. /// Main
  389. void wbmain( void *WBMsg )
  390. {
  391.     main();
  392. }
  393.  
  394. void main( void )
  395. {
  396.     ULONG                   signals, class;
  397.     struct IntuiMessage    *msg;
  398.     int                     code, qualifier;
  399.     struct Gadget          *addr;
  400.     BOOL                    (*func)( void );
  401.  
  402.     if(!( OpenLibs() ))
  403.     CleanUp( 20 );
  404.  
  405.     if(!( IDCMP_Port = CreateMsgPort() ))
  406.     CleanUp( 20 );
  407.  
  408.     editing_mask = ( 1 << IDCMP_Port->mp_SigBit );
  409.  
  410.  
  411.     ReqTags[1] = (ULONG)CatCompArray[ MSG_STRING_0 ].cca_Str;
  412.  
  413.  
  414.     SetupNames();
  415.  
  416.     ParseArguments();
  417.  
  418.     if (!( OpenScr() ))
  419.     CleanUp( 20 );
  420.  
  421.     if (!( opentoolswnd() ))
  422.     CleanUp( 20 );
  423.  
  424.     CaricaPrefs();
  425.  
  426.     MyTask = FindTask( NULL );
  427.     old_WindowPtr = MyTask->pr_WindowPtr;
  428.     MyTask->pr_WindowPtr = BackWnd;
  429.     IE.flags_2 |= WNDPTR;
  430.  
  431.     if( ((struct Library *)SysBase)->lib_Version >= 39 ) {
  432.     List2Tag3[0] = List2Tag2[0] = List2Tag[0] = GTLV_MakeVisible;
  433.     ListWndTag[0] = GTLV_MakeVisible;
  434.     }
  435.  
  436.     SetupRexxPort();
  437.  
  438.     if( RexxPort )
  439.     rexx_mask = 1 << RexxPort->mp_SigBit;
  440.  
  441.     signalset |= editing_mask | rexx_mask | SIGBREAKF_CTRL_C;
  442.  
  443.  
  444.     if(!( GetLoaders() )) {
  445.     IERequest( "Loaders non trovati.", "#@$%$@£#!!",
  446.            MSG_LOADERS_NOTFOUND, 0 );
  447.     }
  448.  
  449.     GetExpanders();
  450.  
  451.     if( IE.flags & LOADGUI )
  452.     CaricaMenued();
  453.  
  454.     IE.flags &= ~WNDCHIUSA;
  455.  
  456.  
  457.     /*****************************************
  458.     **          M A I N    L O O P          **
  459.     *****************************************/
  460.  
  461.  
  462.     do {
  463.  
  464.     signals = Wait( signalset );
  465.  
  466.     if( signals & SIGBREAKF_CTRL_C )
  467.         Ok_to_Run = FALSE;
  468.  
  469.     if( signals & rexx_mask )
  470.         NewHandleRexxMsg();
  471.  
  472.     if( signals & editing_mask )
  473.         HandleIDCMPPort();
  474.  
  475.     if( signals & back_mask ) {
  476.         while( msg = GT_GetIMsg( BackWnd->UserPort )) {
  477.  
  478.         code      = msg->Code;
  479.         class     = msg->Class;
  480.         qualifier = msg->Qualifier;
  481.  
  482.         GT_ReplyIMsg( msg );
  483.  
  484.         switch( class ) {
  485.             case IDCMP_RAWKEY:
  486.             CheckMacroKeys( code, qualifier );
  487.             break;
  488.             case IDCMP_MENUPICK:
  489.             Ok_to_Run = processmenu( code );
  490.             if( IE.flags & ESCI )
  491.                 CleanUp( 0 );
  492.             break;
  493.         }
  494.         }
  495.     }
  496.  
  497.     if (( ToolsWnd ) && ( Ok_to_Run )) {
  498.  
  499.         while( msg = GT_GetIMsg( ToolsWnd->UserPort )) {
  500.  
  501.         code      = msg->Code;
  502.         class     = msg->Class;
  503.         addr      = msg->IAddress;
  504.         qualifier = msg->Qualifier;
  505.  
  506.         GT_ReplyIMsg( msg );
  507.  
  508.         switch( class ) {
  509.  
  510.             case IDCMP_REFRESHWINDOW:
  511.             GT_BeginRefresh( ToolsWnd );
  512.             GT_EndRefresh( ToolsWnd, TRUE );
  513.             break;
  514.  
  515.             case IDCMP_MENUPICK:
  516.             Ok_to_Run = processmenu( code );
  517.             if(!( IE.flags & TOOLSWND ))
  518.                 goto chiusatools;
  519.             break;
  520.  
  521.             case IDCMP_CLOSEWINDOW:
  522.             ToolsCloseWindow();
  523.             goto chiusatools;
  524.             break;
  525.  
  526.             case IDCMP_RAWKEY:
  527.             CheckMacroKeys( code, qualifier );
  528.             break;
  529.  
  530.             case IDCMP_GADGETUP:
  531.             func = addr->UserData;
  532.             Ok_to_Run = (*func)();
  533.             if( IE.win_active )
  534.                 ActivateWindow( IE.win_active );
  535.             if( IE.flags & ESCI )
  536.                 CleanUp( 0 );
  537.             break;
  538.         }
  539.         }
  540. chiusatools:
  541.     }
  542.  
  543.     if( IE.flags & WNDCHIUSA )
  544.         IE.flags &= ~WNDCHIUSA;
  545.  
  546.     if(!( Ok_to_Run )) {
  547.         if(!( IE.flags & SALVATO )) {
  548.  
  549.          code = IERequest( "L'interfaccia attuale non è stata\n"
  550.                    "salvata.  Uscendo   adesso  verrà\n"
  551.                    "persa!",
  552.                    "_Salva|_Esci|_Annulla",
  553.                    MSG_GUI_NOT_SAVED,
  554.                    ANS_SAVE_QUIT_CANCEL );
  555.  
  556.         switch( code ) {
  557.             case 0:
  558.             Ok_to_Run = TRUE;
  559.             break;
  560.             case 1:
  561.             SalvaMenued();
  562.             break;
  563.         }
  564.         }
  565.     }
  566.     } while( Ok_to_Run );
  567.  
  568.     CleanUp( 0 );
  569. }
  570. ///
  571.  
  572.  
  573. /// Process Menu
  574. BOOL processmenu( int code )
  575. {
  576.     struct MenuItem *item;
  577.     BOOL            (*func)( void );
  578.     BOOL            ret;
  579.  
  580.     while(( code != MENUNULL ) && (!( IE.flags & WNDCHIUSA ))) {
  581.     item = ItemAddress( BackMenus, code );
  582.     func = GTMENUITEM_USERDATA( item );
  583.     BackMsg.Code = code;
  584.     code = item->NextSelect;
  585.     if (!( ret = (*func)() ))
  586.         code = MENUNULL;
  587.     }
  588.  
  589.     return( ret );
  590. }
  591. ///
  592. /// Process Key
  593. void ProcessKey( int key, int qual )
  594. {
  595.     struct GadgetInfo *gad;
  596.     struct WindowInfo *wnd;
  597.  
  598.     switch( key ) {
  599.  
  600.     case 127:                   // DEL
  601.         DelGadMenued();
  602.         break;
  603.  
  604.     case 9:                     // TAB
  605.         if( qual & ( 0x10 | 0x20 )) {  // ALT TAB
  606.         if( IE.win_open ) {
  607.  
  608.             wnd = IE.win_info;
  609.             do{
  610.             wnd = wnd->wi_succ;
  611.             if(!( wnd->wi_succ ))
  612.                 wnd = IE.win_list.mlh_Head;
  613.             } while(!( wnd->wi_flags1 & W_APERTA ));
  614.  
  615.             DisattivaTuttiGad();
  616.             ActivateWindow( wnd->wi_winptr );
  617.             WindowToFront( wnd->wi_winptr );
  618.  
  619.             IE.win_active = wnd->wi_winptr;
  620.             IE.win_info   = wnd;
  621.         }
  622.         } else {
  623.         if( IE.win_info->wi_NumGads ) {
  624.             if( IE.gad_id ) {
  625.             DisattivaTuttiGad();
  626.             gad = IE.gad_id->g_Node.ln_Succ;
  627.             if (!( gad->g_Node.ln_Succ ))
  628.                 gad = IE.win_info->wi_Gadgets.mlh_Head;
  629.             } else {
  630.             gad = IE.win_info->wi_Gadgets.mlh_Head;
  631.             }
  632.  
  633.             ContornoGadgets( FALSE );
  634.  
  635.             gad->g_flags2 |= G_ATTIVO;
  636.             IE.gad_id = gad;
  637.  
  638.             ContornoGadgets( TRUE );
  639.         }
  640.         }
  641.         break;
  642.  
  643.     case 13:
  644.         GadTagsMenued();
  645.         IE.flags &= ~MOVE;
  646.         break;
  647.     }
  648. }
  649. ///
  650. /// Process RawKey
  651. void ProcessRawKey( int key, int qual )
  652. {
  653.     struct GadgetInfo *gad;
  654.     struct WindowInfo *wnd;
  655.  
  656.     if( CheckMacroKeys( key, qual ))
  657.     return;
  658.  
  659.     if( key == 0x42 ) {                     // TAB
  660.     if( qual & (0x10 | 0x20) ) {
  661.         if( qual & 3 ) {          // SHIFT ALT TAB
  662.         if( IE.win_open ) {
  663.  
  664.             wnd = IE.win_info;
  665.             do{
  666.             wnd = wnd->wi_pred;
  667.             if(!( wnd->wi_pred ))
  668.                 wnd = IE.win_list.mlh_TailPred;
  669.             } while(!( wnd->wi_flags1 & W_APERTA ));
  670.  
  671.             DisattivaTuttiGad();
  672.             ActivateWindow( wnd->wi_winptr );
  673.             WindowToFront( wnd->wi_winptr );
  674.  
  675.             IE.win_active = wnd->wi_winptr;
  676.             IE.win_info   = wnd;
  677.         }
  678.         }
  679.     } else {
  680.         if( qual & 3 ) {        /// SHIFT TAB
  681.         if( IE.win_info->wi_NumGads ) {
  682.             if( IE.gad_id ) {
  683.             DisattivaTuttiGad();
  684.             gad = IE.gad_id->g_Node.ln_Pred;
  685.             if (!( gad->g_Node.ln_Pred ))
  686.                 gad = IE.win_info->wi_Gadgets.mlh_TailPred;
  687.             } else {
  688.             gad = IE.win_info->wi_Gadgets.mlh_TailPred;
  689.             }
  690.             ContornoGadgets( FALSE );
  691.  
  692.             gad->g_flags2 |= G_ATTIVO;
  693.             IE.gad_id = gad;
  694.  
  695.             ContornoGadgets( TRUE );
  696.         }
  697.         }
  698.     }
  699.     }
  700. }
  701. ///
  702. /// HandleEdit
  703. void HandleEdit( void )
  704. {
  705.     struct GadgetInfo  *old_id;
  706.  
  707.     IE.win_active = IDCMPMsg.IDCMPWindow;
  708.     IE.win_info   = IE.win_active->UserData;
  709.  
  710.     switch( IDCMPMsg.Class ) {
  711.  
  712.     case IDCMP_REFRESHWINDOW:
  713.         GT_BeginRefresh( IE.win_active );
  714.         GT_EndRefresh( IE.win_active, TRUE );
  715.         RinfrescaFinestra();
  716.         break;
  717.  
  718.     case IDCMP_MENUPICK:
  719.         Ok_to_Run = processmenu( IDCMPMsg.Code );
  720.         break;
  721.  
  722.     case IDCMP_VANILLAKEY:
  723.         ProcessKey( IDCMPMsg.Code, IDCMPMsg.Qualifier );
  724.         break;
  725.  
  726.     case IDCMP_ACTIVEWINDOW:
  727.         IE.gad_id = NULL;
  728.         CheckMenuToActive();
  729.         if( IE.mainprefs & PRIMOPIANO )
  730.         WindowToFront( IE.win_active );
  731.         break;
  732.  
  733.     case IDCMP_MOUSEMOVE:
  734.         Coord();
  735.         if( IE.flags & MOVE )
  736.         if(!( ResizeGadgets() ))
  737.             if( ticks > 1 )
  738.             PosizioneGadgets( mousex - oldx, mousey - oldy );
  739.         break;
  740.  
  741.     case IDCMP_CHANGEWINDOW:
  742.         IE.win_info->wi_Width       = IE.win_active->Width;
  743.         IE.win_info->wi_Height      = IE.win_active->Height;
  744.         IE.win_info->wi_Left        = IE.win_active->LeftEdge;
  745.         IE.win_info->wi_Top         = IE.win_active->TopEdge;
  746.         IE.win_info->wi_InnerWidth  = IE.win_active->Width - IE.win_active->BorderLeft - IE.win_active->BorderRight;
  747.         IE.win_info->wi_InnerHeight = IE.win_active->Height - YOffset - IE.win_active->BorderBottom;
  748.         IE.flags &= ~SALVATO;
  749.         break;
  750.  
  751.     case IDCMP_CLOSEWINDOW:
  752.         ChiudiWndMenued();
  753.         break;
  754.  
  755.     case IDCMP_MOUSEBUTTONS:
  756.         switch( IDCMPMsg.Code ) {
  757.         case 0xE8:
  758.             IE.flags &= ~MOVE;
  759.             break;
  760.         case 0x68:
  761.             clickx = oldx = mousex;
  762.             clicky = oldy = mousey;
  763.             if(!( IDCMPMsg.Qualifier & 3 ))
  764.             DisattivaTuttiGad();
  765.             old_id = IE.gad_id;
  766.             AttivaGadgets();
  767.             if( TestAttivi() ) {
  768.             if( old_id == IE.gad_id ) {
  769.                 static ULONG    OldSecs, OldMicros;
  770.  
  771.                 if( DoubleClick( OldSecs, OldMicros, IDCMPMsg.Seconds, IDCMPMsg.Micros )) {
  772.                 GadTagsMenued();
  773.                 IE.flags &= ~MOVE;
  774.                 }
  775.  
  776.                 OldSecs   = IDCMPMsg.Seconds;
  777.                 OldMicros = IDCMPMsg.Micros;
  778.             }
  779.             ticks = 0;
  780.             }
  781.             break;
  782.         }
  783.         break;
  784.  
  785.     case IDCMP_INTUITICKS:
  786.         ticks += 1;
  787.         break;
  788.  
  789.     case IDCMP_RAWKEY:
  790.         ProcessRawKey( IDCMPMsg.Code, IDCMPMsg.Qualifier );
  791.         break;
  792.     }
  793.  
  794.     if( IE.flags & ESCI )
  795.     CleanUp( 0 );
  796. }
  797. ///
  798.  
  799.  
  800. /// CheckMacroKeys
  801. BOOL BackRawKey( void )
  802. {
  803.     CheckMacroKeys( BackMsg.Code, BackMsg.Qualifier );
  804. }
  805.  
  806. BOOL CheckMacroKeys( int code, int qual )
  807. {
  808.     BOOL    ret = FALSE;
  809.  
  810.     code -= 80;
  811.  
  812.     if(( code >= 0 ) && ( code <= 9 )) {
  813.  
  814.     ret = TRUE;
  815.  
  816.     if( qual & 3 )          // shift
  817.         code += 10;
  818.     else
  819.         if( qual & ( 0x10 | 0x20 ))     // alt
  820.         code += 20;
  821.  
  822.     if( Macros[code][0] ) {
  823.         if (!( SendRexxMsg( "REXX", "IE", &Macros[code][0], NULL, 0 ))) {
  824.         Stat( CatCompArray[ ERR_NOREXX ].cca_Str, TRUE, 0 );
  825.         }
  826.     }
  827.     }
  828.  
  829.     return( ret );
  830. }
  831. ///
  832.  
  833. /// Fine
  834. BOOL FineMenued( void )
  835. {
  836.     return( FALSE );
  837. }
  838. ///
  839.  
  840. /// CheckMenuToActive
  841. void CheckMenuToActive( void )
  842. {
  843.     if( IE.win_info->wi_NumGads + IE.win_info->wi_NumBools + IE.win_info->wi_NumObjects + IE.win_info->wi_NumGBanks )
  844.     MenuGadgetAttiva();
  845.     else
  846.     MenuGadgetDisattiva();
  847.  
  848.     if( IE.win_info->wi_NumBoxes )
  849.     OnMenu( BackWnd, (1<<11)|(16<<5)|1 );
  850.     else
  851.     OffMenu( BackWnd, (1<<11)|(16<<5)|1 );
  852.  
  853.     if( IE.win_info->wi_NumImages ) {
  854.     OnMenu( BackWnd, (1<<11)|(17<<5)|1 );
  855.     OnMenu( BackWnd, (2<<11)|(17<<5)|1 );
  856.     } else {
  857.     OffMenu( BackWnd, (1<<11)|(17<<5)|1 );
  858.     OffMenu( BackWnd, (2<<11)|(17<<5)|1 );
  859.     }
  860.  
  861.     if( IE.win_info->wi_NumTexts ) {
  862.     OnMenu( BackWnd, (1<<11)|(18<<5)|1 );
  863.     OnMenu( BackWnd, (2<<11)|(18<<5)|1 );
  864.     OnMenu( BackWnd, (3<<11)|(18<<5)|1 );
  865.     } else {
  866.     OffMenu( BackWnd, (1<<11)|(18<<5)|1 );
  867.     OffMenu( BackWnd, (2<<11)|(18<<5)|1 );
  868.     OffMenu( BackWnd, (3<<11)|(18<<5)|1 );
  869.     }
  870. }
  871. ///
  872.  
  873. //      Routines di Chiusura
  874. /// Chiusura librerie
  875. void CloseLibs( void )
  876. {
  877.     if (GfxBase)        CloseLibrary(GfxBase);
  878.     if (IntuitionBase)  CloseLibrary(IntuitionBase);
  879.     if (AslBase)        CloseLibrary(AslBase);
  880.     if (GadToolsBase)   CloseLibrary(GadToolsBase);
  881.     if (ReqToolsBase)   CloseLibrary(ReqToolsBase);
  882.     if (DiskfontBase)   CloseLibrary(DiskfontBase);
  883.     if (IFFParseBase)   CloseLibrary(IFFParseBase);
  884.     if (IconBase)       CloseLibrary(IconBase);
  885.     if (LocaleBase)     CloseLibrary(LocaleBase);
  886.     if (RexxSysBase)    CloseLibrary(RexxSysBase);
  887. }
  888. ///
  889. /// CleanUp
  890. void CleanUp( ULONG ret )
  891. {
  892.     ClearGUI();
  893.  
  894.     FreeMacroItems();
  895.  
  896.     CloseScr();
  897.  
  898.     if( IDCMP_Port )
  899.     DeleteMsgPort( IDCMP_Port );
  900.  
  901.     if( IE.flags_2 & WNDPTR )
  902.     MyTask->pr_WindowPtr = old_WindowPtr;
  903.  
  904.     if( old_Dir )
  905.     CurrentDir( old_Dir );
  906.  
  907.     UnLoadSeg( KeyFileSeg );
  908.  
  909.     if( IE.mainprefs & WB_OPEN )
  910.     OpenWorkBench();
  911.  
  912.     FreeLoaders();
  913.     FreeExpanders();
  914.     FreeARexxCmds();
  915.  
  916.     DeleteRexxPort();
  917.  
  918.     if( GenBase )
  919.     CloseLibrary(( struct Library * )GenBase );
  920.  
  921.     if(( LocaleBase ) && ( Catalog ))
  922.     CloseCatalog( Catalog );
  923.  
  924.     CloseLibs();
  925.  
  926.     exit( ret );
  927. }
  928. ///
  929. /// FreeLoaders
  930. void FreeLoaders( void )
  931. {
  932.     struct LoaderNode  *loader;
  933.  
  934.     while( loader = RemTail(( struct List * )&Loaders )) {
  935.     CloseLibrary( loader->LoaderBase );
  936.     FreeMem( loader, sizeof( struct LoaderNode ));
  937.     }
  938. }
  939. ///
  940.  
  941. //      Routines di Inizializzazione
  942. /// Apertura librerie
  943. BOOL OpenLibs(void)
  944. {
  945.  
  946.     if (!( IntuitionBase = OpenLibrary("intuition.library",36)))    return( FALSE );
  947.     if (!( GfxBase       = OpenLibrary("graphics.library", 36)))    return( FALSE );
  948.     if (!( GadToolsBase  = OpenLibrary("gadtools.library", 36)))    return( FALSE );
  949.     if (!( AslBase       = OpenLibrary("asl.library",      36)))    return( FALSE );
  950.     if (!( ReqToolsBase  = OpenLibrary("reqtools.library", 38)))    return( FALSE );
  951.     if (!( DiskfontBase  = OpenLibrary("diskfont.library", 36)))    return( FALSE );
  952.     if (!( IFFParseBase  = OpenLibrary("iffparse.library", 36)))    return( FALSE );
  953.     if (!( IconBase      = OpenLibrary("icon.library",     36)))    return( FALSE );
  954.  
  955.     LocaleBase = OpenLibrary( "locale.library", 38 );
  956.  
  957.     SetupLocale();
  958.  
  959.     RexxSysBase = OpenLibrary( "rexxsyslib.library", 36 );
  960.  
  961.     return( TRUE );
  962. }
  963. ///
  964. /// Parsing degli argomenti
  965. void ParseArguments( void )
  966. {
  967.     struct WBArg       *Args;
  968.     struct RDArgs      *Arguments;
  969.     ULONG               ArgArray[] = { 0 };
  970.  
  971.     if(!( _WBMsg )) {
  972.  
  973.     NameFromLock( (BPTR)GetProgramDir(), DefaultTool, 256 );
  974.     GetProgramName( save_file, MAX_PATH );
  975.     AddPart( DefaultTool, save_file, 256 );
  976.     save_file[0] = '\0';
  977.  
  978.     if( Arguments = ReadArgs( TEMPLATE, ArgArray, NULL )) {
  979.         if( ArgArray[0] ) {
  980.  
  981.         strcpy( allpath2, (STRPTR)ArgArray[0] );
  982.  
  983.         strcpy( initial_file, FilePart( allpath2 ));
  984.  
  985.         UBYTE   *to = initial_drawer, *ptr2, *from = allpath2;
  986.  
  987.         ptr2 = PathPart( allpath2 );
  988.         while( to < ptr2 )
  989.             *to++ = *from++;
  990.         *to = '\0';
  991.  
  992.         IE.flags |= LOADGUI;
  993.         }
  994.         FreeArgs( Arguments );
  995.     }
  996.  
  997.     } else {
  998.  
  999.     Args = _WBMsg->sm_ArgList;
  1000.  
  1001.     old_Dir = CurrentDir( Args[0].wa_Lock );
  1002.     NameFromLock( Args[0].wa_Lock, DefaultTool, 256 );
  1003.     AddPart( DefaultTool, Args[0].wa_Name, 256 );
  1004.  
  1005.     if( _WBMsg->sm_NumArgs > 1 ) {
  1006.  
  1007.         NameFromLock( Args[1].wa_Lock, allpath2, MAX_PATH );
  1008.         strcpy( initial_drawer, allpath2 );
  1009.  
  1010.         AddPart( allpath2, Args[1].wa_Name, MAX_PATH );
  1011.         strcpy( initial_file, Args[1].wa_Name );
  1012.  
  1013.         strcpy( save_file, allpath2 );
  1014.  
  1015.         IE.flags |= LOADGUI;
  1016.     }
  1017.  
  1018.     }
  1019.  
  1020. }
  1021. ///
  1022. /// Setup Names
  1023. void SetupNames( void )
  1024. {
  1025.     BOOL    Go = TRUE;
  1026.     WORD    cnt = 0;
  1027.     APTR    lock;
  1028.  
  1029.     Forbid();
  1030.  
  1031.     while ( Go ) {
  1032.     cnt += 1;
  1033.     sprintf( MyPubName, PubName_fmt, cnt );
  1034.  
  1035.     if ( lock = LockPubScreen( MyPubName ))
  1036.         UnlockPubScreen( NULL, lock );
  1037.         else
  1038.         Go = FALSE;
  1039.     }
  1040.  
  1041.     Permit();
  1042.  
  1043.     cnt = 0;
  1044.     while ( ScreenTags[ cnt ] != SA_PubName ) cnt += 2;
  1045.     ScreenTags[ cnt+1 ] = (ULONG)MyPubName;
  1046.  
  1047. }
  1048. ///
  1049. /// Get Loaders
  1050. BOOL GetLoaders( void )
  1051. {
  1052.     BOOL                ret = FALSE;
  1053.     struct AnchorPath  *anchorpath;
  1054.     struct LoaderNode  *loader;
  1055.     UBYTE               buffer[255];
  1056.     ULONG               error;
  1057.  
  1058.     if( anchorpath = (struct AnchorPath *)AllocMem( sizeof( struct AnchorPath ) ,MEMF_CLEAR )) {
  1059.  
  1060.     error = MatchFirst( "PROGDIR:Loaders/#?.loader", anchorpath );
  1061.     while( error == 0 ) {
  1062.  
  1063.         if( loader = AllocMem( sizeof( struct LoaderNode ), MEMF_CLEAR )) {
  1064.  
  1065.         strcpy( buffer, "PROGDIR:Loaders/" );
  1066.         strcat( buffer, anchorpath->ap_Info.fib_FileName );
  1067.  
  1068.         if( loader->LoaderBase = OpenLibrary( buffer, 37 )) {
  1069.  
  1070.             AddTail(( struct List * )&Loaders, (struct Node *)loader );
  1071.             ret = TRUE;
  1072.  
  1073.         } else
  1074.             FreeMem( loader, sizeof( struct LoaderNode ));
  1075.  
  1076.         error = MatchNext( anchorpath );
  1077.         }
  1078.     }
  1079.  
  1080.     MatchEnd( anchorpath );
  1081.     FreeMem( anchorpath, sizeof( struct AnchorPath ));
  1082.     }
  1083.  
  1084.     return( ret );
  1085. }
  1086. ///
  1087.  
  1088. /// ReqHandle
  1089. ULONG ReqHandle( struct Window *Wnd, ULONG ( *Handler )( void ))
  1090. {
  1091.     ULONG   mask, ed, req;
  1092.  
  1093.     ed  = 1 << IDCMP_Port->mp_SigBit;
  1094.     req = 1 << Wnd->UserPort->mp_SigBit;
  1095.  
  1096.     mask = ed | req;
  1097.  
  1098.     for(;;) {
  1099.     ULONG   signals;
  1100.  
  1101.     signals = Wait( mask );
  1102.  
  1103.     if( signals & ed ) {
  1104.         struct IntuiMessage *msg;
  1105.  
  1106.         while( msg = GT_GetIMsg( IDCMP_Port )) {
  1107.         ULONG   class;
  1108.  
  1109.         class         = msg->Class;
  1110.         IE.win_active = msg->IDCMPWindow;
  1111.  
  1112.         GT_ReplyIMsg( msg );
  1113.  
  1114.         IE.win_info = IE.win_active->UserData;
  1115.  
  1116.         if( class == IDCMP_REFRESHWINDOW ) {
  1117.             GT_BeginRefresh( IE.win_active );
  1118.             GT_EndRefresh( IE.win_active, TRUE );
  1119.             RinfrescaFinestra();
  1120.         }
  1121.         }
  1122.     }
  1123.  
  1124.     if( signals & req )
  1125.         return(( *Handler )() );
  1126.     }
  1127. }
  1128. ///
  1129.  
  1130. /// IERequest
  1131. int IERequest( STRPTR Body, STRPTR Gadgets, ULONG BodyID, ULONG GadID )
  1132. {
  1133.     int     ret;
  1134.  
  1135.     if( BodyID )
  1136.     Body = CatCompArray[ BodyID ].cca_Str;
  1137.  
  1138.     if( GadID )
  1139.     Gadgets = CatCompArray[ GadID ].cca_Str;
  1140.  
  1141.     LockAllWindows();
  1142.  
  1143.     ret = rtEZRequestA( Body, Gadgets, NULL, NULL, (struct TagItem *)ReqTags );
  1144.  
  1145.     UnlockAllWindows();
  1146.  
  1147.     return( ret );
  1148. }
  1149. ///
  1150.  
  1151. /// Informazioni
  1152. BOOL AboutMenued( void )
  1153. {
  1154.     ULONG       chip, fast;
  1155.  
  1156.     if( IERequest( CatCompArray[ MSG_ABOUT ].cca_Str,
  1157.            CatCompArray[ ANS_MORE_CONT ].cca_Str, 0, 0 )) {
  1158.  
  1159.     chip = AvailMem( MEMF_CHIP );
  1160.     fast = AvailMem( MEMF_FAST );
  1161.  
  1162.     LockAllWindows();
  1163.  
  1164.     rtEZRequest( CatCompArray[ MSG_SYSINFO ].cca_Str,
  1165.              ok_txt, NULL, (struct TagItem *)ReqTags,
  1166.              UserData.Name, UserData.Number, MyPubName, RexxPortName,
  1167.              chip, fast, chip + fast );
  1168.  
  1169.     UnlockAllWindows();
  1170.     }
  1171.  
  1172.     return( TRUE );
  1173. }
  1174. ///
  1175.  
  1176. /// Apre per la prima volta lo schermo
  1177. BOOL OpenScr( void )
  1178. {
  1179.     struct DrawInfo     *drinfo;
  1180.     int                 cnt, max;
  1181.  
  1182.     if( SetupScreen())
  1183.     return( FALSE );
  1184.     else {
  1185.  
  1186.     IE.ScreenData->Tags[1]          = Scr->Width;
  1187.     BackWTags[ WT_HEIGHT ].ti_Data  = Scr->Height;
  1188.     IE.ScreenData->Tags[3]          = Scr->Height;
  1189.     BackWTags[ WT_WIDTH  ].ti_Data  = Scr->Width;
  1190.  
  1191.     if( Scr->Flags & AUTOSCROLL )
  1192.         IE.ScreenData->Tags[ SCRAUTOSCROLL ] = TRUE;
  1193.  
  1194.     IE.ScreenData->Tags[ SCRID ] = GetVPModeID( &Scr->ViewPort );
  1195.  
  1196.     if( drinfo = GetScreenDrawInfo( Scr )) {
  1197.  
  1198.         if( drinfo->dri_NumPens > 12 )
  1199.         max = 12;
  1200.         else
  1201.         max = drinfo->dri_NumPens;
  1202.  
  1203.         for( cnt = 0; cnt < max; cnt++ )
  1204.         IE.ScreenData->DriPens[cnt] = drinfo->dri_Pens[ cnt ];
  1205.  
  1206.         IE.ScreenData->Tags[ SCRDEPTH ] = drinfo->dri_Depth;
  1207.  
  1208.         FreeScreenDrawInfo( Scr, drinfo );
  1209.     }
  1210.  
  1211.     if( OpenBackWindow() )
  1212.         return( FALSE );
  1213.     else {
  1214.  
  1215.         signalset = back_mask = 1 << BackWnd->UserPort->mp_SigBit;
  1216.  
  1217.         IE.ScreenData->Screen  = (APTR)WorkWndTags[ WORKSCR ] = Scr;
  1218.  
  1219.         IE.ScreenData->Visual  = VisualInfo;
  1220.         IE.ScreenData->YOffset = YOffset;
  1221.         IE.ScreenData->XOffset = XOffset;
  1222.  
  1223.         PubScreenStatus( Scr, 0L );
  1224.  
  1225.         return( TRUE );
  1226.     }
  1227.  
  1228.     }
  1229. }
  1230. ///
  1231.  
  1232. /// Chiusura schermo
  1233. void CloseScr( void )
  1234. {
  1235.     struct Message  *Msg;
  1236.  
  1237.     Forbid();
  1238.  
  1239.     while( Msg = GetMsg( IDCMP_Port ))
  1240.     ReplyMsg( Msg );
  1241.  
  1242.     CloseReqs();
  1243.  
  1244.     if( ToolsWnd )
  1245.     ClearMenuStrip( ToolsWnd );
  1246.  
  1247.     ToolsCloseWindow();
  1248.  
  1249.     CloseBackWindow();
  1250.  
  1251.     Permit();
  1252.  
  1253.     CheckForVisitors();
  1254.  
  1255.     CloseDownScreen();
  1256.  
  1257.     if( IE.colortable ) {
  1258.     FreeVec( IE.colortable );
  1259.     IE.colortable = NULL;
  1260.     }
  1261. }
  1262. ///
  1263.  
  1264. /// Varie
  1265. void Stat( __A0 STRPTR txt, __D0 BOOL beep, __D1 ULONG catn )
  1266. {
  1267.     if( beep )
  1268.     DisplayBeep( NULL );
  1269.  
  1270.     if( ToolsWnd ) {
  1271.  
  1272.     if( catn )
  1273.         txt = CatCompArray[ catn ].cca_Str;
  1274.  
  1275.     TextTag[1] = txt;
  1276.     GT_SetGadgetAttrsA( ToolsGadgets[ GD_Status ], ToolsWnd,
  1277.                 NULL, (struct TagItem *)TextTag );
  1278.     }
  1279. }
  1280.  
  1281.  
  1282. void Coord( void )
  1283. {
  1284.     int     x, y;
  1285.  
  1286.     if( IE.win_active->MouseX > 0 )
  1287.     x = IE.win_active->MouseX;
  1288.     else
  1289.     x = 0;
  1290.  
  1291.     if( IE.win_active->MouseY > 0 )
  1292.     y = IE.win_active->MouseY;
  1293.     else
  1294.     y = 0;
  1295.  
  1296.     if( IE.win_active->Width < x )
  1297.     x = IE.win_active->Width;
  1298.  
  1299.     if( IE.win_active->Height < y )
  1300.     y = IE.win_active->Height;
  1301.  
  1302.     mousex = x;
  1303.     mousey = y;
  1304.  
  1305.     x -= offx;
  1306.     y -= offy;
  1307.  
  1308.     sprintf( coord_txt, CoordFmt_txt, x, y );
  1309.  
  1310.     PrintIText( &Scr->RastPort, &CoordIText, Scr->Width, 1 );
  1311. }
  1312.  
  1313. BOOL SaveGUIClicked( void )
  1314. {
  1315.     return( SalvaMenued() );
  1316. }
  1317. ///
  1318.  
  1319. /// Finestra strumenti
  1320. BOOL opentoolswnd( void )
  1321. {
  1322.     LONG    ret;
  1323.  
  1324.     LayoutWindow( ToolsWTags );
  1325.  
  1326.     ToolsWTags[ WT_LEFT ].ti_Data = toolsx;
  1327.     ToolsWTags[ WT_TOP  ].ti_Data = toolsy;
  1328.  
  1329.     ret = OpenToolsWindow();
  1330.  
  1331.     PostOpenWindow( ToolsWTags );
  1332.  
  1333.     if( ret )
  1334.     return( FALSE );
  1335.  
  1336.     ModifyIDCMP( ToolsWnd, IDCMP_REFRESHWINDOW | IDCMP_GADGETUP | IDCMP_MENUPICK | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY );
  1337.     signalset |= ( 1 << ToolsWnd->UserPort->mp_SigBit );
  1338.  
  1339.     SetMenuStrip( ToolsWnd, BackMenus );
  1340.  
  1341.     IE.mainprefs |= TOOLSWND;
  1342.  
  1343.     return( TRUE );
  1344. }
  1345.  
  1346. void ToolsCloseWindow( void )
  1347. {
  1348.     struct MenuItem *item;
  1349.  
  1350.     if ( ToolsWnd ) {
  1351.  
  1352.     toolsx = ToolsWnd->LeftEdge;
  1353.     toolsy = ToolsWnd->TopEdge;
  1354.  
  1355.     ClearMenuStrip( ToolsWnd );
  1356.  
  1357.     signalset &= ~(1 << ToolsWnd->UserPort->mp_SigBit);
  1358.  
  1359.     CloseToolsWindow();
  1360.  
  1361.     ClearMenuStrip( BackWnd );
  1362.  
  1363.     item = ItemAddress( BackMenus, PREFS_MENU );
  1364.  
  1365.     item->Flags &= ~CHECKED;
  1366.  
  1367.     ResetMenuStrip( BackWnd, BackMenus );
  1368.  
  1369.     IE.mainprefs &= ~TOOLSWND;
  1370.     }
  1371. }
  1372.  
  1373.  
  1374. BOOL ToolsWndMenued( void )
  1375. {
  1376.     if( ToolsWnd )
  1377.     ToolsCloseWindow();
  1378.     else {
  1379.     opentoolswnd();
  1380.  
  1381.     Stat( CatCompArray[ MSG_HERE_I_AM ].cca_Str, FALSE, 0 );
  1382.     }
  1383.  
  1384.     return( TRUE );
  1385. }
  1386. ///
  1387.  
  1388. /// ToolsGadgets On e Off
  1389. void ToolsGadgetsOn( void )
  1390. {
  1391.     struct Gadget   *first;
  1392.     int             cnt;
  1393.  
  1394.     if( ToolsWnd ) {
  1395.  
  1396.     first = ToolsWnd->FirstGadget;
  1397.  
  1398.     while( first->GadgetType & GTYP_SYSGADGET )
  1399.         first = first->NextGadget;
  1400.  
  1401.     RemoveGList( ToolsWnd, first, -1 );
  1402.  
  1403.     for( cnt = 0; cnt < 5; cnt++ )
  1404.         Tools_gads[ cnt ]->Flags &= ~GFLG_DISABLED;
  1405.  
  1406.     AddGList( ToolsWnd, first, -1, -1, NULL );
  1407.     RefreshGadgets( first, ToolsWnd, NULL );
  1408.     }
  1409. }
  1410.  
  1411. void ToolsGadgetsOff( void )
  1412. {
  1413.     struct Gadget   *first;
  1414.     int             cnt;
  1415.  
  1416.     if( ToolsWnd ) {
  1417.  
  1418.     first = ToolsWnd->FirstGadget;
  1419.  
  1420.     while( first->GadgetType & GTYP_SYSGADGET )
  1421.         first = first->NextGadget;
  1422.  
  1423.     RemoveGList( ToolsWnd, first, -1 );
  1424.  
  1425.     for( cnt = 0; cnt < 5; cnt++ )
  1426.         Tools_gads[ cnt ]->Flags |= GFLG_DISABLED;
  1427.  
  1428.     AddGList( ToolsWnd, first, -1, -1, NULL );
  1429.     RefreshGadgets( first, ToolsWnd, NULL );
  1430.     }
  1431. }
  1432. ///
  1433.  
  1434. /// Preferenze
  1435. void CaricaPrefs( void )
  1436. {
  1437.     int     cnt;
  1438.     UWORD   num = 0;
  1439.     UBYTE   buffer[256];
  1440.     static UBYTE buffer2[256] = "PROGDIR:Generators/";
  1441.  
  1442.     if ( File = Open( PrefsFile, MODE_OLDFILE )) {
  1443.  
  1444.     IE.mainprefs = FGetC( File );
  1445.     IE.AsmPrefs  = FGetC( File );
  1446.     IE.C_Prefs   = FGetC( File );
  1447.     IE.AsmPrefs2 = FGetC( File );
  1448.     FRead( File, AP_IntString2, 60, 1 );
  1449.     FRead( File, AP_GadString2, 60, 1 );
  1450.     FRead( File, CP_ChipString2, 25, 1 );
  1451.  
  1452.     for( cnt = 0; cnt < 30; cnt++ ) {
  1453.         FGetString( &Macros[ cnt ][0] );
  1454.     }
  1455.  
  1456.     FGetString( AP_DosString2 );
  1457.     FGetString( AP_RexxString2 );
  1458.     FGetString( AP_GfxString2 );
  1459.     FGetString( AP_FntString2 );
  1460.  
  1461.     FGetString( buffer );
  1462.     strcat( buffer2, buffer );
  1463.  
  1464.     GenBase = OpenLibrary( buffer2, 37 );
  1465.  
  1466.     FRead( File, &num, 2, 1 );
  1467.     for( cnt = 0; cnt < num; cnt++ ) {
  1468.         FGetString( buffer );
  1469.         AddMacroItem( buffer );
  1470.     }
  1471.  
  1472.     Close( File );
  1473.  
  1474.     if(!( IE.mainprefs & TOOLSWND ))
  1475.         ToolsWndMenued();
  1476.  
  1477.     SistemaPrefsMenu();
  1478.     }
  1479. }
  1480.  
  1481.  
  1482.  
  1483. BOOL SavePrefsMenued( void )
  1484. {
  1485.     int                 cnt;
  1486.     struct MacroNode   *mac;
  1487.  
  1488.     if ( File = Open( PrefsFile, MODE_NEWFILE )) {
  1489.  
  1490.     FPutC( File, IE.mainprefs );
  1491.     FPutC( File, IE.AsmPrefs );
  1492.     FPutC( File, IE.C_Prefs );
  1493.     FPutC( File, IE.AsmPrefs2 );
  1494.     FWrite( File, AP_IntString2, 60, 1 );
  1495.     FWrite( File, AP_GadString2, 60, 1 );
  1496.     FWrite( File, CP_ChipString2, 25, 1 );
  1497.  
  1498.     for( cnt = 0; cnt < 30; cnt++ )
  1499.         PutString( Macros[ cnt ] );
  1500.  
  1501.     PutString( AP_DosString2 );
  1502.     PutString( AP_RexxString2 );
  1503.     PutString( AP_GfxString2 );
  1504.     PutString( AP_FntString2 );
  1505.  
  1506.     if( GenBase )
  1507.         PutString( GenBase->Lib.lib_Node.ln_Name );
  1508.     else
  1509.         PutString( "" );
  1510.  
  1511.     FWrite( File, &NumMacros, 2, 1 );
  1512.     for( mac = MacroList.mlh_Head; mac->Node.ln_Succ; mac = mac->Node.ln_Succ )
  1513.         PutString( mac->File );
  1514.  
  1515.     Close( File );
  1516.  
  1517.     } else {
  1518.  
  1519.     Stat( CatCompArray[ ERR_IOERR ].cca_Str, TRUE, 0 );
  1520.     }
  1521.  
  1522.     return( TRUE );
  1523. }
  1524. ///
  1525.  
  1526. /// SistemaPrefsMenu
  1527. void SistemaPrefsMenu( void )
  1528. {
  1529.     struct MenuItem *item;
  1530.  
  1531.     SistemaGadgetsItem();
  1532.  
  1533.     ClearMenuStrip( BackWnd );
  1534.  
  1535.     if( IE.mainprefs & WB_OPEN ){
  1536.  
  1537.     ToggleWBMenued();
  1538.     item = ItemAddress( BackMenus, (3<<5)|PREFS_MENU );
  1539.     item->Flags &= ~CHECKED;
  1540.     }
  1541.  
  1542.     if( IE.mainprefs & PRIMOPIANO ) {
  1543.  
  1544.     item = ItemAddress( BackMenus, (5<<5)|PREFS_MENU );
  1545.     item->Flags |= CHECKED;
  1546.     }
  1547.  
  1548.     if( IE.mainprefs & WFLAGS ) {
  1549.  
  1550.     item = ItemAddress( BackMenus, (6<<5)|PREFS_MENU );
  1551.     item->Flags |= CHECKED;
  1552.     }
  1553.  
  1554.     if( IE.mainprefs & CREAICONE ) {
  1555.  
  1556.     item = ItemAddress( BackMenus, (11<<5)|PREFS_MENU );
  1557.     item->Flags |= CHECKED;
  1558.     }
  1559.  
  1560.     ResetMenuStrip( BackWnd, BackMenus );
  1561. }
  1562. ///
  1563.  
  1564. /// Usa Gadgets
  1565. BOOL UsaGadsMenued( void )
  1566. {
  1567.     return( ToggleGadgetsClicked() );
  1568. }
  1569.  
  1570. BOOL ToggleGadgetsClicked( void )
  1571. {
  1572.     if( IE.mainprefs & STACCATI ) {
  1573.     IE.mainprefs &= ~STACCATI;
  1574.     AttaccaGadgets();
  1575.     } else {
  1576.     StaccaGadgets();
  1577.     IE.mainprefs |= STACCATI;
  1578.     }
  1579.  
  1580.     SistemaGadgetsItem();
  1581.  
  1582.     return( TRUE );
  1583. }
  1584.  
  1585. void SistemaGadgetsItem( void )
  1586. {
  1587.     struct MenuItem *item;
  1588.     int              pos;
  1589.  
  1590.     ClearMenuStrip( BackWnd );
  1591.  
  1592.     item = ItemAddress( BackMenus, (( 1 << 5 ) | PREFS_MENU ));
  1593.  
  1594.     if( ToolsWnd )
  1595.     pos = RemoveGadget( ToolsWnd, &ToggleGadgetsGadget );
  1596.  
  1597.     if(!( IE.mainprefs & STACCATI )) {
  1598.     item->Flags |= CHECKED;
  1599.     ToggleGadgetsGadget.Flags |= GFLG_SELECTED;
  1600.     } else {
  1601.     item->Flags &= ~CHECKED;
  1602.     ToggleGadgetsGadget.Flags &= ~GFLG_SELECTED;
  1603.     }
  1604.  
  1605.     ResetMenuStrip( BackWnd, BackMenus );
  1606.  
  1607.     if( ToolsWnd ) {
  1608.     AddGadget( ToolsWnd, &ToggleGadgetsGadget, pos );
  1609.     RefreshGList( &ToggleGadgetsGadget, ToolsWnd, NULL, 1 );
  1610.     }
  1611. }
  1612. ///
  1613.  
  1614. /// Gestione flags vari
  1615. BOOL IconeMenued( void )
  1616. {
  1617.     IE.mainprefs ^= CREAICONE;
  1618.     return( TRUE );
  1619. }
  1620.  
  1621. BOOL WndInFrontMenued( void )
  1622. {
  1623.     IE.mainprefs ^= PRIMOPIANO;
  1624.     return( TRUE );
  1625. }
  1626. ///
  1627.  
  1628. /// Apertura/Chiusura del WB
  1629. BOOL ToggleWBMenued( void )
  1630. {
  1631.     struct MenuItem *item;
  1632.  
  1633.     ClearMenuStrip( BackWnd );
  1634.  
  1635.     item = ItemAddress( BackMenus, (3<<5)|PREFS_MENU );
  1636.  
  1637.     if( IE.mainprefs & WB_OPEN ) {
  1638.     if( OpenWorkBench() ) {
  1639.         IE.mainprefs &= ~WB_OPEN;
  1640.     } else {
  1641.         Stat( CatCompArray[ ERR_NOWB ].cca_Str, TRUE, 0 );
  1642.         item->Flags &= ~CHECKED;
  1643.     }
  1644.     } else {
  1645.     if( CloseWorkBench() ) {
  1646.         IE.mainprefs |= WB_OPEN;
  1647.     } else {
  1648.         Stat( CatCompArray[ ERR_CLOSEWB ].cca_Str, TRUE, 0 );
  1649.         item->Flags |= CHECKED;
  1650.     }
  1651.     }
  1652.  
  1653.     ResetMenuStrip( BackWnd, BackMenus );
  1654.  
  1655.     return( TRUE );
  1656. }
  1657. ///
  1658.  
  1659. /// Parametri Sorgente
  1660. static  UBYTE   FlagsBack, SrcFlagsBack;
  1661.  
  1662. BOOL SrcParamsMenued( void )
  1663. {
  1664.     ULONG    ret;
  1665.  
  1666.     LayoutWindow( SrcParamsWTags );
  1667.     ret = OpenSrcParamsWindow();
  1668.     PostOpenWindow( SrcParamsWTags );
  1669.  
  1670.     if( ret ) {
  1671.     DisplayBeep( Scr );
  1672.     CloseSrcParamsWindow();
  1673.     } else {
  1674.  
  1675.     FlagsBack = IE.flags_2;
  1676.     SrcFlagsBack = IE.SrcFlags;
  1677.  
  1678.     IE.flags_2 ^= GENERASCR;
  1679.     IE.SrcFlags = ~IE.SrcFlags;
  1680.     SP_GenScrKeyPressed();
  1681.     SP_FontAdaptKeyPressed();
  1682.     SP_OpenFontsKeyPressed();
  1683.     SP_mainKeyPressed();
  1684.     SP_ShdPortKeyPressed();
  1685.     IE.SrcFlags = SrcFlagsBack;
  1686.  
  1687.     StringTag[1] = SharedPort;
  1688.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_ShdPortIn ], SrcParamsWnd,
  1689.                 NULL, (struct TagItem *)StringTag );
  1690.  
  1691.     SrcParamsWnd->ExtData = HandleSrcParams;
  1692.     }
  1693.  
  1694.     return( TRUE );
  1695. }
  1696.  
  1697. void HandleSrcParams( void )
  1698. {
  1699.     if(!( HandleSrcParamsIDCMP() ))
  1700.     CloseSrcParamsWindow();
  1701. }
  1702.  
  1703. BOOL SrcParamsVanillaKey( void )
  1704. {
  1705.     switch( IDCMPMsg.Code ) {
  1706.     case 13:
  1707.         return( SP_OkClicked() );
  1708.     case 27:
  1709.         return( SP_AnnullaClicked() );
  1710.     }
  1711.  
  1712.     return( TRUE );
  1713. }
  1714.  
  1715. BOOL SP_OkKeyPressed( void )
  1716. {
  1717.     return( SP_OkClicked() );
  1718. }
  1719.  
  1720. BOOL SP_OkClicked( void )
  1721. {
  1722.     strcpy( SharedPort, GetString( SrcParamsGadgets[ GD_SP_ShdPortIn ]));
  1723.  
  1724.     return( FALSE );
  1725. }
  1726.  
  1727. BOOL SP_AnnullaKeyPressed( void )
  1728. {
  1729.     return( SP_AnnullaClicked() );
  1730. }
  1731.  
  1732. BOOL SP_AnnullaClicked( void )
  1733. {
  1734.     IE.flags_2  = FlagsBack;
  1735.     IE.SrcFlags = SrcFlagsBack;
  1736.     return( FALSE );
  1737. }
  1738.  
  1739. BOOL SP_FontAdaptKeyPressed( void )
  1740. {
  1741.     if( IE.SrcFlags & FONTSENSITIVE )
  1742.     CheckedTag[1] = FALSE;
  1743.     else
  1744.     CheckedTag[1] = TRUE;
  1745.  
  1746.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_FontAdapt ], SrcParamsWnd,
  1747.             NULL, (struct TagItem *)CheckedTag );
  1748.  
  1749.     return( SP_FontAdaptClicked() );
  1750. }
  1751.  
  1752. BOOL SP_FontAdaptClicked( void )
  1753. {
  1754.     IE.SrcFlags ^= FONTSENSITIVE;
  1755.     return( TRUE );
  1756. }
  1757.  
  1758. BOOL SP_GenScrKeyPressed( void )
  1759. {
  1760.     if( IE.flags_2 & GENERASCR )
  1761.     CheckedTag[1] = FALSE;
  1762.     else
  1763.     CheckedTag[1] = TRUE;
  1764.  
  1765.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_GenScr ], SrcParamsWnd,
  1766.             NULL, (struct TagItem *)CheckedTag );
  1767.  
  1768.     return( SP_GenScrClicked() );
  1769. }
  1770.  
  1771. BOOL SP_GenScrClicked( void )
  1772. {
  1773.     IE.flags_2 ^= GENERASCR;
  1774.     return( TRUE );
  1775. }
  1776.  
  1777. BOOL SP_OpenFontsKeyPressed( void )
  1778. {
  1779.     if( IE.SrcFlags & OPENDISKFONT )
  1780.     CheckedTag[1] = FALSE;
  1781.     else
  1782.     CheckedTag[1] = TRUE;
  1783.  
  1784.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_OpenFonts ], SrcParamsWnd,
  1785.             NULL, (struct TagItem *)CheckedTag );
  1786.  
  1787.     return( SP_OpenFontsClicked() );
  1788. }
  1789.  
  1790. BOOL SP_OpenFontsClicked( void )
  1791. {
  1792.     IE.SrcFlags ^= OPENDISKFONT;
  1793.     return( TRUE );
  1794. }
  1795.  
  1796. BOOL SP_mainKeyPressed( void )
  1797. {
  1798.     if( IE.SrcFlags & MAINPROC )
  1799.     CheckedTag[1] = FALSE;
  1800.     else
  1801.     CheckedTag[1] = TRUE;
  1802.  
  1803.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_main ], SrcParamsWnd,
  1804.             NULL, (struct TagItem *)CheckedTag );
  1805.  
  1806.     return( SP_mainClicked() );
  1807. }
  1808.  
  1809. BOOL SP_mainClicked( void )
  1810. {
  1811.     IE.SrcFlags ^= MAINPROC;
  1812.     return( TRUE );
  1813. }
  1814.  
  1815. BOOL SP_ShdPortKeyPressed( void )
  1816. {
  1817.     CheckedTag[1] = ( IE.SrcFlags & SHARED_PORT ) ? FALSE : TRUE;
  1818.  
  1819.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_ShdPort ], SrcParamsWnd,
  1820.             NULL, (struct TagItem *)CheckedTag );
  1821.  
  1822.     return( SP_ShdPortClicked() );
  1823. }
  1824.  
  1825. BOOL SP_ShdPortClicked( void )
  1826. {
  1827.     IE.SrcFlags ^= SHARED_PORT;
  1828.  
  1829.     DisableTag[1] = (IE.SrcFlags & SHARED_PORT) ? FALSE : TRUE;
  1830.     GT_SetGadgetAttrsA( SrcParamsGadgets[ GD_SP_ShdPortIn ], SrcParamsWnd,
  1831.             NULL, (struct TagItem *)DisableTag );
  1832.  
  1833.     if(!( DisableTag[1] ))
  1834.     ActivateGadget( SrcParamsGadgets[ GD_SP_ShdPortIn ], SrcParamsWnd, NULL );
  1835.  
  1836.  
  1837.     return( TRUE );
  1838. }
  1839.  
  1840. BOOL SP_ShdPortInClicked( void )
  1841. {
  1842.     return( TRUE );
  1843. }
  1844. ///
  1845.  
  1846. /// Aggiungi/Elimina font
  1847. void LiberaFntLst( void )
  1848. {
  1849.     struct TxtAttrNode *ta;
  1850.  
  1851.     while( ta = RemTail((struct List *)&IE.FntLst )) {
  1852.  
  1853.     if( ta->txa_Ptr )
  1854.         CloseFont( ta->txa_Ptr );
  1855.  
  1856.     FreeMem( ta, sizeof( struct TxtAttrNode ));
  1857.     }
  1858. }
  1859.  
  1860. void EliminaFont( __A0 struct TxtAttrNode *font )
  1861. {
  1862.     if( font ) {
  1863.     font->txa_OpenCnt -= 1;
  1864.  
  1865.     if(!( font->txa_OpenCnt )) {
  1866.  
  1867.         if( font->txa_Ptr )
  1868.         CloseFont( font->txa_Ptr );
  1869.  
  1870.         Remove(( struct Node *)font );
  1871.  
  1872.         FreeMem( font, sizeof( struct TxtAttrNode ));
  1873.     }
  1874.     }
  1875. }
  1876.  
  1877. struct TxtAttrNode *AggiungiFont( __A0 struct TextAttr *font )
  1878. {
  1879.     struct TxtAttrNode *ta;
  1880.  
  1881.     if(!( font ))
  1882.     return( NULL );
  1883.  
  1884.     for( ta = IE.FntLst.mlh_Head; ta->txa_Next; ta = ta->txa_Next ) {
  1885.     if( strcmp( ta->txa_Name, font->ta_Name ) == 0 )
  1886.         if(( ta->txa_Size == font->ta_YSize ) && ( ta->txa_Flags == font->ta_Flags ) && ( ta->txa_Style == font->ta_Style )) {
  1887.         ta->txa_OpenCnt += 1;
  1888.         return( ta );
  1889.         }
  1890.     }
  1891.  
  1892.     if( ta = AllocMem( sizeof( struct TxtAttrNode ), MEMF_CLEAR )) {
  1893.  
  1894.     AddTail(( struct List * )&IE.FntLst, (struct Node *)ta );
  1895.  
  1896.     ta->txa_Ptr         = OpenDiskFont( font );
  1897.     ta->txa_OpenCnt     = 1;
  1898.     ta->txa_FontName    = ta->txa_Name;
  1899.  
  1900.     strcpy( ta->txa_FontName, font->ta_Name );
  1901.  
  1902.     ta->txa_Size        = font->ta_YSize;
  1903.     ta->txa_Style       = font->ta_Style;
  1904.     ta->txa_Flags       = font->ta_Flags;
  1905.  
  1906.     UBYTE   *from, *to;
  1907.     TEXT     buf[32];
  1908.  
  1909.     from = ta->txa_FontName;
  1910.     to   = buf;
  1911.     while( *from != '.' )
  1912.         *to++ = *from++;
  1913.     *to = '\0';
  1914.  
  1915.     sprintf( ta->txa_Label, "%s%d_%d%d",
  1916.          buf,
  1917.          ta->txa_Size,
  1918.          ta->txa_Style,
  1919.          ta->txa_Flags );
  1920.  
  1921.     } else {
  1922.     Stat( CatCompArray[ ERR_NOMEMORY ].cca_Str, TRUE, 0 );
  1923.     ta = NULL;
  1924.     }
  1925.  
  1926.     return( ta );
  1927. }
  1928. ///
  1929.  
  1930. /// Rect
  1931. void Rect( int x1, int y1, int x2, int y2 )
  1932. {
  1933.     APTR    rp = IE.win_active->RPort;
  1934.  
  1935.     SetAPen( rp, 1 );
  1936.  
  1937.     Move( rp, x1, y1 );
  1938.     Draw( rp, x2, y1 );
  1939.     Draw( rp, x2, y2 );
  1940.     Draw( rp, x1, y2 );
  1941.     Draw( rp, x1, y1 );
  1942.     WritePixel( rp, x1, y1 );
  1943. }
  1944. ///
  1945.  
  1946. /// Draw Rect
  1947. void DrawRect( UWORD w, UWORD h )
  1948. {
  1949.     struct IntuiMessage    *msg;
  1950.     int                     code, x, y;
  1951.     ULONG                   class;
  1952.     struct Window          *wnd;
  1953.     BOOL                    ok = TRUE, trace = FALSE;
  1954.  
  1955.     SetDrMd( IE.win_active->RPort, COMPLEMENT );
  1956.  
  1957.     w -= 1;
  1958.     h -= 1;
  1959.  
  1960.     do {
  1961.     WaitPort( IE.win_active->UserPort );
  1962.  
  1963.     while( msg = GT_GetIMsg( IE.win_active->UserPort )) {
  1964.  
  1965.         class = msg->Class;
  1966.         code  = msg->Code;
  1967.         wnd   = msg->IDCMPWindow;
  1968.  
  1969.         GT_ReplyIMsg( msg );
  1970.  
  1971.         if( IE.win_active == wnd ) {
  1972.  
  1973.         x = wnd->MouseX;
  1974.         y = wnd->MouseY;
  1975.  
  1976.         switch( class ) {
  1977.  
  1978.             case IDCMP_REFRESHWINDOW:
  1979.             GT_BeginRefresh( wnd );
  1980.             GT_EndRefresh( wnd, TRUE );
  1981.             break;
  1982.  
  1983.             case IDCMP_MOUSEBUTTONS:
  1984.             switch( code ) {
  1985.                 case 0xE8:
  1986.                 ok = FALSE;
  1987.                 break;
  1988.  
  1989.                 case 0x68:
  1990.                 trace = TRUE;
  1991.                 clickx = lastx = wnd->MouseX;
  1992.                 clicky = lasty = wnd->MouseY;
  1993.                 if( IE.flags & RECTFIXED ) {
  1994.                     offx = w >> 1;
  1995.                     offy = h >> 1;
  1996.                     Rect( clickx, clicky, clickx + w, clicky + h );
  1997.                 } else {
  1998.                     offx = clickx;
  1999.                     offy = clicky;
  2000.                 }
  2001.                 break;
  2002.             }
  2003.             break;
  2004.  
  2005.             case IDCMP_MOUSEMOVE:
  2006.             Coord();
  2007.             if( trace ) {
  2008.                 if( IE.flags & RECTFIXED ) {
  2009.                 Rect( clickx, clicky, clickx + w, clicky + h );
  2010.                 clickx = x - offx;
  2011.                 clicky = y - offy;
  2012.                 Rect( clickx, clicky, clickx + w, clicky + h );
  2013.                 } else {
  2014.                 Rect( clickx, clicky, lastx, lasty );
  2015.                 lastx = x;
  2016.                 lasty = y;
  2017.                 Rect( clickx, clicky, lastx, lasty );
  2018.                 }
  2019.             }
  2020.             break;
  2021.         }
  2022.         }
  2023.     }
  2024.  
  2025.     } while( ok );
  2026.  
  2027.     if( IE.flags & RECTFIXED ) {
  2028.     lastx = clickx;
  2029.     lasty = clicky;
  2030.     Rect( clickx, clicky, clickx + w, clicky + h );
  2031.     } else {
  2032.     Rect( clickx, clicky, lastx, lasty );
  2033.     }
  2034.  
  2035.     offx = offy = 0;
  2036.     Coord();
  2037.  
  2038.     SetDrMd( IE.win_active->RPort, JAM1 );
  2039. }
  2040. ///
  2041.  
  2042. /// Nuovo
  2043. BOOL NuovoMenued( void )
  2044. {
  2045.     int     cnt;
  2046.  
  2047.     if(!( IE.flags & SALVATO )) {
  2048.     if(!( IERequest( CatCompArray[ MSG_DELETE_OR_NOT ].cca_Str, CatCompArray[ ANS_YES_NO ].cca_Str, 0, 0 )))
  2049.         return( TRUE );
  2050.     }
  2051.  
  2052.     IE.flags |= SALVATO;
  2053.  
  2054.     save_file[0] = '\0';
  2055.  
  2056.     for( cnt = 0; cnt < ATTIVAMENU_NUOVAW_NUM; cnt++ )
  2057.     OffMenu( BackWnd, attivamenu_nuovawin[ cnt ]);
  2058.  
  2059.     MenuGadgetDisattiva();
  2060.     ToolsGadgetsOff();
  2061.  
  2062.     ClearGUI();
  2063.  
  2064.     return( TRUE );
  2065. }
  2066. ///
  2067.  
  2068. /// Clear GUI
  2069. void ClearGUI( void )
  2070. {
  2071.     IE.num_win = IE.win_open = 0;
  2072.     IE.win_active = IE.win_info = NULL;
  2073.  
  2074.     IE.flags |= WNDCHIUSA;
  2075.  
  2076.     EliminaAllWorkWnd();
  2077.     FreeImgList();
  2078.     LiberaARexxCmds();
  2079.     EliminaMainProcData();
  2080.     LiberaFntLst();
  2081.  
  2082.     IE.ScreenData->St_Left    = 0;
  2083.     IE.ScreenData->St_Top     = 0;
  2084.     IE.ScreenData->Title[0]   = '\0';
  2085.     IE.ScreenData->PubName[0] = '\0';
  2086.     IE.ScreenData->ScrAttrs   = SC_SHOWTITLE | SC_DRAGGABLE;
  2087.  
  2088.     IE.MainProcFlags = 0;
  2089.     IE.SrcFlags      = 0;
  2090.  
  2091.     IE.RexxExt[0]      = '\0';
  2092.     IE.RexxPortName[0] = '\0';
  2093.     IE.ExtraProc[0]    = '\0';
  2094.  
  2095.     IE.Locale->Catalog[0]  = '\0';
  2096.     IE.Locale->JoinFile[0] = '\0';
  2097.     IE.Locale->BuiltIn[0]  = '\0';
  2098.     IE.Locale->Version     = 0;
  2099.  
  2100.     FreeLocaleData();
  2101.  
  2102.     IE.SharedPort[0] = '\0';
  2103. }
  2104. ///
  2105.  
  2106. /// Lista Fin
  2107. BOOL ApriListaFin( STRPTR titolo, ULONG titnum, struct MinList *list )
  2108. {
  2109.     int     ret;
  2110.  
  2111.     LockAllWindows();
  2112.  
  2113.     if(( LocaleBase ) && ( titnum ))
  2114.     titolo = GetCatalogStr( Catalog, titnum, titolo );
  2115.  
  2116.     ListaWTags[9].ti_Data = titolo;
  2117.  
  2118.     LayoutWindow( ListaWTags );
  2119.     ret = OpenListaWindow();
  2120.     PostOpenWindow( ListaWTags );
  2121.  
  2122.     if( ret ) {
  2123.     DisplayBeep( Scr );
  2124.     ChiudiListaFin();
  2125.     ret = FALSE;
  2126.     } else {
  2127.  
  2128. //        SetWindowTitles( ListaWnd, titolo, (APTR)-1 );
  2129.  
  2130.     ListTag[1] = list;
  2131.     GT_SetGadgetAttrsA( ListaGadgets[ GD_Lista ], ListaWnd,
  2132.                 NULL, (struct TagItem *)ListTag );
  2133.  
  2134.     ret = TRUE;
  2135.     }
  2136.  
  2137.     return( ret );
  2138. }
  2139.  
  2140. void ChiudiListaFin( void )
  2141. {
  2142.     CloseListaWindow();
  2143.     UnlockAllWindows();
  2144. }
  2145.  
  2146. WORD GestisciListaFin( UWORD code, UWORD max )
  2147. {
  2148.     WORD   ret = -1;
  2149.  
  2150.     buffer  = max;
  2151.     buffer2 = code;
  2152.     buffer3 = TRUE;
  2153.  
  2154.     while( ReqHandle( ListaWnd, HandleListaIDCMP ));
  2155.  
  2156.     if(( code ) && ( buffer3 ))
  2157.     ret = ListWndTag[1];
  2158.  
  2159.     return( ret );
  2160. }
  2161.  
  2162. BOOL ListaCloseWindow( void )
  2163. {
  2164.     buffer3 = FALSE;
  2165.     return( FALSE );
  2166. }
  2167.  
  2168. BOOL ListaRawKey( void )
  2169. {
  2170.     switch( ListaMsg.Code ){
  2171.  
  2172.     case 0x45:              // ESC
  2173.         buffer3 = FALSE;
  2174.         return( FALSE );
  2175.  
  2176.     case 0x44:              // return
  2177.         return( ListaSelect() );
  2178.  
  2179.     case 0x4D:              // giù
  2180.         if( ListWndTag[1] < buffer - 1 )
  2181.         ListWndTag[1] += 1;
  2182.         else
  2183.         ListWndTag[1] = 0;
  2184.         ListWndTag[3] = ListWndTag[1];
  2185.         GT_SetGadgetAttrsA( ListaGadgets[ GD_Lista ], ListaWnd, NULL, (struct TagItem *)ListWndTag );
  2186.         break;
  2187.  
  2188.     case 0x4C:              // su
  2189.         if( ListWndTag[1] )
  2190.         ListWndTag[1] -= 1;
  2191.         else
  2192.         ListWndTag[1] = buffer - 1;
  2193.         ListWndTag[3] = ListWndTag[1];
  2194.         GT_SetGadgetAttrsA( ListaGadgets[ GD_Lista ], ListaWnd, NULL, (struct TagItem *)ListWndTag );
  2195.         break;
  2196.     }
  2197.     return( TRUE );
  2198. }
  2199.  
  2200. BOOL ListaSelect( void )
  2201. {
  2202.     int          cnt;
  2203.     struct Node *node;
  2204.  
  2205.     if( buffer2 == EXIT ) {
  2206.     return( FALSE );
  2207.     } else {
  2208.  
  2209.     *list_to_eor ^= list_from_eor[ ListWndTag[1] ];
  2210.  
  2211.     node = (APTR)ListTag[1];
  2212.     for( cnt = 0; cnt <= ListWndTag[1]; cnt ++ )
  2213.         node = node->ln_Succ;
  2214.  
  2215.     if( node->ln_Name[0] == ' ' )
  2216.         node->ln_Name[0] = '*';
  2217.     else
  2218.         node->ln_Name[0] = ' ';
  2219.  
  2220.     GT_RefreshWindow( ListaWnd, NULL );
  2221.  
  2222.     }
  2223.  
  2224.     return( TRUE );
  2225. }
  2226.  
  2227. BOOL ListaClicked( void )
  2228. {
  2229.     ListWndTag[1] = ListWndTag[3] = ListaMsg.Code;
  2230.     return( ListaSelect() );
  2231. }
  2232. ///
  2233.  
  2234. /// GetFile2
  2235. BOOL GetFile2( BOOL savemode, STRPTR titolo, STRPTR pattern, ULONG titn, STRPTR ext )
  2236. {
  2237.     UBYTE   *ptr, ch;
  2238.     BOOL     ok;
  2239.     struct   FileRequester *req;
  2240.  
  2241.     if(( ext ) && ( initial_file[0] )) {
  2242.     ptr = initial_file;
  2243.  
  2244.     do {
  2245.         ch = *ptr++;
  2246.     } while(( ch != '.' ) && ( ch ));
  2247.  
  2248.     if(!( ch )) {
  2249.         ptr--;
  2250.         *ptr++ = '.';
  2251.     }
  2252.  
  2253.     strcpy( ptr, ext );
  2254.     }
  2255.  
  2256.     if( LocaleBase )
  2257.     titolo = GetCatalogStr( Catalog, titn, titolo );
  2258.  
  2259.     if( req = AllocAslRequest( ASL_FileRequest, NULL )) {
  2260.  
  2261.     if( ok = AslRequestTags( req, ASLFR_DoPatterns,     TRUE,
  2262.                  ASLFR_InitialHeight,  Scr->Height - 40,
  2263.                  ASLFR_TitleText,      titolo,
  2264.                  ASLFR_InitialFile,    initial_file,
  2265.                  ASLFR_InitialDrawer,  initial_drawer,
  2266.                  ASLFR_InitialPattern, pattern,
  2267.                  ASLFR_Window,         BackWnd,
  2268.                  ASLFR_DoSaveMode,     (ULONG)savemode,
  2269.                  TAG_DONE )) {
  2270.  
  2271.         strcpy( initial_file, req->fr_File );
  2272.         strcpy( initial_drawer, req->fr_Drawer );
  2273.         strcpy( allpath2, req->fr_Drawer );
  2274.         AddPart( allpath2, req->fr_File, MAX_PATH );
  2275.         strcpy( allpath, allpath2 );
  2276.  
  2277.     }
  2278.  
  2279.     FreeAslRequest( req );
  2280.  
  2281.     } else {
  2282.     Stat( CatCompArray[ ERR_NOASL ].cca_Str, TRUE, 0 );
  2283.     ok = FALSE;
  2284.     }
  2285.  
  2286.     return( ok );
  2287. }
  2288. ///
  2289.  
  2290. /// Generazione Sorgente
  2291. BOOL GeneraMenued( void )
  2292. {
  2293.     struct GenFiles    *files;
  2294.     struct IEXNode     *ex;
  2295.     struct WindowInfo  *BackUpWnd, *wnd;
  2296.     struct ArrayNode   *array;
  2297.     ULONG               cnt;
  2298.  
  2299.     if(!( GenBase )) {
  2300.     GenPrefsMenued();
  2301.     return( TRUE );
  2302.     }
  2303.  
  2304.     if(!( IE.flags_2 & REXXCALL ))
  2305.     if(!( GetFile2( TRUE, CatCompArray[ MSG_CREATE ].cca_Str, GenBase->Pattern, MSG_CREATE, GenBase->Ext )))
  2306.         return( TRUE );
  2307.  
  2308.     Stat( CatCompArray[ MSG_CREATE ].cca_Str, FALSE, 0 );
  2309.  
  2310.     AccodaBooleani();
  2311.  
  2312.     BackUpWnd = IE.win_info;
  2313.  
  2314.     for( wnd = IE.win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  2315.  
  2316.     SistemaGadgetsFlags( &wnd->wi_Gadgets );
  2317.  
  2318.     if( wnd->wi_NumTexts + wnd->wi_NumBoxes + wnd->wi_NumImages )
  2319.         wnd->wi_NeedRender = TRUE;
  2320.     else
  2321.         wnd->wi_NeedRender = FALSE;
  2322.     }
  2323.  
  2324.     DetacheGBanks();
  2325.  
  2326.     GetStrings();
  2327.  
  2328.     if(!( IE.SrcFlags & LOCALIZE )) {
  2329.     struct LocaleStr   *str;
  2330.  
  2331.     for( str = IE.Locale->ExtraStrings.mlh_Head; str->Node.ln_Succ; str = str->Node.ln_Succ )
  2332.         if( str->Node.ln_Pri & LOC_GUI )
  2333.         break;
  2334.  
  2335.     for( cnt = 0; str->Node.ln_Succ; str = str->Node.ln_Succ )
  2336.         sprintf( str->ID, "String%ld", cnt++ );
  2337.     }
  2338.  
  2339.     for( cnt = 0, array = IE.Locale->Arrays.mlh_Head; array->Next; array = array->Next )
  2340.     sprintf( array->Label, "Array%ld", cnt++ );
  2341.  
  2342.     for( ex = IE.Expanders.mlh_Head; ex->Node.ln_Succ; ex = ex->Node.ln_Succ ) {
  2343.     struct Generator *IEXBase = ex->Base;
  2344.  
  2345.     ex->Support = IEX_StartSrcGen( ex->ID, &IE );
  2346.  
  2347.     ex->UseCount = 0;
  2348.     for( wnd = IE.win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  2349.         struct GadgetInfo *gad;
  2350.         for( gad = wnd->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  2351.  
  2352.         if( gad->g_Kind == ex->ID )
  2353.             ex->UseCount += 1;
  2354.         }
  2355.     }
  2356.     }
  2357.  
  2358.     WriteCatalogs( allpath2 );
  2359.  
  2360.     if( files = OpenFiles( &IE, allpath2 )) {
  2361.  
  2362.     WriteHeaders( files, &IE );
  2363.  
  2364.     WriteVars( files, &IE );
  2365.  
  2366.     WriteChipData( files, &IE );
  2367.  
  2368.     WriteStrings( files, &IE );
  2369.  
  2370.     WriteData( files, &IE );
  2371.  
  2372.     WriteCode( files, &IE );
  2373.  
  2374.     CloseFiles( files );
  2375.  
  2376.     Stat( CatCompArray[ MSG_SOURCE_CREATED ].cca_Str, FALSE, 0 );
  2377.  
  2378.     } else
  2379.     Stat( CatCompArray[ ERR_IOERR ].cca_Str, TRUE, 0 );
  2380.  
  2381.     ReAttachGBanks();
  2382.     PutStrings();
  2383.  
  2384.     IE.win_info = BackUpWnd;
  2385.  
  2386.     return( TRUE );
  2387. }
  2388. ///
  2389. /// SistemaGadgetsFlags
  2390. void SistemaGadgetsFlags( struct MinList *Gadgets )
  2391. {
  2392.     struct GadgetInfo  *gad;
  2393.  
  2394.     for( gad = Gadgets->mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  2395.     if( gad->g_Kind < MIN_IEX_ID ) {
  2396.  
  2397.         if(( gad->g_Kind != TEXT_KIND ) && ( gad->g_Kind != NUMBER_KIND ))
  2398.         gad->g_flags2 |= G_CLICKED;
  2399.  
  2400.         if(( gad->g_Tags & 1 ) && ( gad->g_Key ))
  2401.         gad->g_flags2 |= G_KEYPRESSED;
  2402.         else
  2403.         gad->g_flags2 &= ~G_KEYPRESSED;
  2404.     }
  2405.     }
  2406. }
  2407. ///
  2408.  
  2409. /// Get Generators
  2410. BOOL GetGenerators( void )
  2411. {
  2412.     BOOL                    ret = FALSE;
  2413.     struct AnchorPath      *anchorpath;
  2414.     struct GeneratorNode   *gen;
  2415.     UBYTE                   buffer[255];
  2416.     ULONG                   error;
  2417.  
  2418.     if( anchorpath = (struct AnchorPath *)AllocMem( sizeof( struct AnchorPath ) ,MEMF_CLEAR )) {
  2419.  
  2420.     error = MatchFirst( "PROGDIR:Generators/#?.generator", anchorpath );
  2421.     while( error == 0 ) {
  2422.  
  2423.         if( gen = AllocMem( sizeof( struct LoaderNode ), MEMF_CLEAR )) {
  2424.  
  2425.         strcpy( buffer, "PROGDIR:Generators/" );
  2426.         strcat( buffer, anchorpath->ap_Info.fib_FileName );
  2427.  
  2428.         if( gen->GenBase = OpenLibrary( buffer, 37 )) {
  2429.  
  2430.             AddTail(( struct List * )&Generators, (struct Node *)gen );
  2431.  
  2432.             gen->Node.ln_Name = gen->GenBase->Lib.lib_Node.ln_Name;
  2433.  
  2434.             ret = TRUE;
  2435.  
  2436.         } else {
  2437.             FreeMem( gen, sizeof( struct GeneratorNode ));
  2438.             error = TRUE;
  2439.         }
  2440.  
  2441.         if (!( error ))
  2442.             error = MatchNext( anchorpath );
  2443.         }
  2444.     }
  2445.  
  2446.     MatchEnd( anchorpath );
  2447.     FreeMem( anchorpath, sizeof( struct AnchorPath ));
  2448.     }
  2449.  
  2450.     return( ret );
  2451. }
  2452. ///
  2453. /// Free Generators
  2454. void FreeGenerators( void )
  2455. {
  2456.     struct GeneratorNode   *gen;
  2457.  
  2458.     while( gen = RemTail(( struct List * )&Generators )) {
  2459.     CloseLibrary(( struct Library * )gen->GenBase );
  2460.     FreeMem( gen, sizeof( struct GeneratorNode ));
  2461.     }
  2462. }
  2463. ///
  2464.  
  2465. /// NewHandleRexxMsg
  2466. void NewHandleRexxMsg( void )
  2467. {
  2468.     ULONG           ArgArray[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  2469.     WORD            n;
  2470.     struct RDArgs   *args = NULL, *rdargs;
  2471.     struct RexxMsg  *RxMsg;
  2472.     UBYTE           buffer[1024], command[256];
  2473.     UBYTE           *arguments;
  2474.     BOOL            found = FALSE, fail = FALSE;
  2475.  
  2476.     while( RxMsg = (struct RexxMsg *)GetMsg( RexxPort )) {
  2477.  
  2478.     if( RxMsg->rm_Node.mn_Node.ln_Type == NT_REPLYMSG ) {
  2479.  
  2480.         if( RxMsg->rm_Args[15] )
  2481.             ReplyMsg(( struct Message * )RxMsg->rm_Args[15] );
  2482.  
  2483.         DeleteArgstring( RxMsg->rm_Args[0] );
  2484.         DeleteRexxMsg( RxMsg );
  2485.         RX_Unconfirmed -= 1;
  2486.  
  2487.     } else {
  2488.  
  2489.         RxMsg->rm_Result1 = NULL;
  2490.         RxMsg->rm_Result2 = NULL;
  2491.         strcpy( buffer, RxMsg->rm_Args[0] );
  2492.  
  2493.         n = 0;
  2494.         while(( buffer[n] != '\0' ) && ( buffer[n] != ' ' )) {
  2495.         command[n] = buffer[n];
  2496.         n++;
  2497.         };
  2498.         command[n] = '\0';
  2499.  
  2500.         n = 0;
  2501.         struct CmdNode *Cmd;
  2502.         for( Cmd = RexxCommands.mlh_Head; Cmd->Node.ln_Succ; Cmd = Cmd->Node.ln_Succ ) {
  2503.         if( stricmp( Cmd->Node.ln_Name, command ) == 0 ) {
  2504.             found = TRUE;
  2505.             break;
  2506.         }
  2507.         };
  2508.  
  2509.         if( found ) {
  2510.         if( Cmd->Template ) {
  2511.             if( args = AllocDosObject( DOS_RDARGS, NULL )) {
  2512.  
  2513.             arguments = buffer + strlen( Cmd->Node.ln_Name );
  2514.  
  2515.             strcat( arguments, "\12" );
  2516.             args->RDA_Source.CS_Buffer = arguments;
  2517.             args->RDA_Source.CS_Length = strlen( arguments );
  2518.             args->RDA_Source.CS_CurChr = 0;
  2519.             args->RDA_DAList           = NULL;
  2520.             args->RDA_Buffer           = NULL;
  2521.             args->RDA_BufSiz           = 0L;
  2522.             args->RDA_Flags           |= RDAF_NOPROMPT;
  2523.  
  2524.             if( rdargs = ReadArgs( Cmd->Template, ArgArray, args )) {
  2525.  
  2526.                 switch( Cmd->Node.ln_Type ) {
  2527.                 case 0:
  2528.                     RxMsg->rm_Result1 = (*Cmd->Routine)(ArgArray, RxMsg);
  2529.                     break;
  2530.                 case 1:
  2531.                     RxMsg->rm_Result1 = ( *(( struct ExCmdNode * )Cmd )->Routine )( ArgArray, RxMsg, &IE, (( struct ExCmdNode * )Cmd )->ID );
  2532.                     break;
  2533.                 }
  2534.  
  2535.                 FreeArgs( rdargs );
  2536.  
  2537.             } else
  2538.                 fail = TRUE;
  2539.  
  2540.             FreeDosObject( DOS_RDARGS, args );
  2541.  
  2542.             } else
  2543.             fail = TRUE;
  2544.  
  2545.         } else {
  2546.             switch( Cmd->Node.ln_Type ) {
  2547.             case 0:
  2548.                 RxMsg->rm_Result1 = (*Cmd->Routine)(ArgArray, RxMsg);
  2549.                 break;
  2550.             case 1:
  2551.                 RxMsg->rm_Result1 = ( *(( struct ExCmdNode * )Cmd )->Routine )( ArgArray, RxMsg, &IE, (( struct ExCmdNode * )Cmd )->ID );
  2552.                 break;
  2553.             }
  2554.         }
  2555.  
  2556.         } else
  2557.         if(!( SendRexxMsg( "REXX", "IE", RxMsg->rm_Args[0], RxMsg, 0 )))
  2558.             fail = TRUE;
  2559.  
  2560.         if( fail )
  2561.         RxMsg->rm_Result1 = RC_FATAL;
  2562.  
  2563.         if( found )
  2564.         ReplyMsg(( struct Message * )RxMsg );
  2565.  
  2566.     }
  2567.     }
  2568. }
  2569. ///
  2570.  
  2571.